1、什么是事务
事务是数据库操作的最近本单元,逻辑上一组操作,要么都成成,要么都失败
2、事务的四个特性
- 原子性
- 一致性
- 隔离性
- 持久性
3、声明式事务(基于注解)
1.spring 配置文件配置事务管理器
<bean class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="poolDataSource"></property>
</bean>
<!-- 1、配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="poolDataSource"></property>
</bean>
<!-- 2、开启基于注解的事务控制,依赖tx名称空间 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 3、给事务方法加注解 -->
@Transactional
3、声明式事务(完全注解反方式)
- 创建配置类代替配置文件
- 注解开启事务
- 配置
@Configuration
@ComponentScan(basePackages = {"com.chzu.spring05"})
@EnableTransactionManagement //开启事务
public class TxConfig {
@Bean
public DataSource getDataSource(){
DruidDataSource source = new DruidDataSource(); source.setDriverClassName("");
source.setUrl("");
source.setUsername("");
source.setPassword("");
return source;
}}
//JDBCTemplate和DataSourceTransactionManager也要使用@Bean添加
4、声明式事务管理
@Transactional注解中可以配置参数
- timeout:事务超出指定时长后自动回滚并终止(以秒为单位)
- readOnly: 只读事务,优化查询速度,如果事务全是查
- noRollbackFor:那些异常不需要回滚
- rollbackFor:那些异常需要回滚
- isolation:隔离级别
- propagation:事务的传播行为
异常分类
- 运行时异常:可以不用处理 默认都回滚
- 编译时异常:必须处理 try catch 或 throw 默认不回滚
//不需要回滚
@Transactional(noRollbackFor= {ArithmeticException.class,} )
//事务的隔离性级别
@Transactional(isolation = Isolation.READ_COMMITTED)
事务的隔离性级别
脏读:
幻读:
不可重复读:
- 读未提交:
- 读已提交:
- 可重复读:
- 序列化
脏读 | 幻读 | 不可重复读 | |
---|---|---|---|
READ_UNCOMMITTED | 有 | 有 | 有 |
READ_COMMITTED | 无 | 有 | 有 |
REPEATABLE_READ | 无 | 有 | 无 |
SERIALIZABLE | 无 | 无 | 无 |
Orcle | Mysql | |
---|---|---|
READ_UNCOMMITTED | 支持 | |
READ_COMMITTED | 支持 | 支持 |
REPEATABLE_READ | 有(默认) | |
SERIALIZABLE | 支持 | 有 |
事务的传播行为
有七种传播行为,前两种用的最多
- REQUIRED:如果有事务在运行,当前方法就在这个事务内运行,否则就开启一个新的事务运行
- REQUIRED_NEW:当前方法必须开启新的事务,并在它自己的事务内运行,如果有事务正在运行,应该将它挂起
@Transactional(propagetion=Propagation.REQUEIRED)