SpringMybatis - 事务级操作
事务
事务指的是一组数据库的操作,这组操作要么同时成功,要么同时失败
事务特性
- 隔离性
- 不同事务之间彼此隔离,互不影响
- 原子性
- 每个事务是一个不可分割的整体
- 一致性
- 事务中的操作要么同时成功,要么同时失败,状态一致
- 持久性
- 事务在提交后影响就会持久化,不再变动
原始实现
对于JDBC而言,事务的实现是基于Connection类的rollback和commit实现的
1 | Connection con=...; |
声明式事务
在Spring-Mybatis中,可以通过XML配置或者注解配置的方式将一组操作声明为一组事务,省去了繁琐的实现过程
配置
我们需要在Spring容器中添加一个DataSourceTransactionManager的Bean来开启事务的管理
1 | <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> |
1 |
|
声明
在开启事务后,在事务方法上添加@Transactional
注解即可声明
- 此外@Transactional也可以注解在类上,代表该类的所有方法均为事务操作
1
2
3
4
5
6
7
8
9
10
public class UserService{
private UserDao userDao;
public void action(){
...
}
}
事务传播
当事务嵌套调用时:如事务A调用了事务B,则事务B的调用失败也会导致事务A的调用失败
但是对于某些不重要的事务,我们可能希望该事务的失败不会影响调用它的上级事务的失败,需要避免事务传播的行为
这时需要通过@Transcational的propagation参数
- REQUIRED(默认值)
- 若外层方法也为事务,则该方法加入到和外层方法的同一事务中
- 若外层方法不是事务,则该方法被独立声明为事务
- SUPPORT
- 若外层方法也为事务,则该方法加入到和外层方法的同一事务中
- 若外层方法不是事务,则该方法也不是事务
- REQUIRED_NEW
- 无论外层方法是否为事务,该方法都将自己独立声明为一个新的事务
- NOT_SUPPORT
- 无论外层方法是否为事务,该方法都不是事务
- MANDATORY
- 若外层方法也为事务,则该方法加入到和外层方法的同一事务中
- 若外层方法不是事务,则报错
- NEVER
- 若外层方法也为事务,则报错
- 若外层方法不是事务,则该方法也不是事务
隔离级别
我们可以通过@Transactional的isolation参数设置事务的隔离级别
Comments