文章优先发布在个人博客上面哦 https://www.xdx97.com/article/754707243290591232
Transactional_2">一、@Transactional
1-1、使用
我们只需要在类或者方法上面加上 @Transactional 注解,即可开启事务。
Transactional_11">1-2、@Transactional的属性
属性名 | 说明 |
---|---|
name | 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。 |
propagation | 事务的传播行为,默认值为 REQUIRED。 REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。 |
isolation | 事务的隔离度,默认值采用 DEFAULT。 READ_UNCOMMITTED:读未提交,可能会导致脏读、幻读、不可重复读 READ_COMMITTED:读已提交,可能会导致幻读、不可重复读 REPEATABLE_READ:可重复读,可能会导致幻读 SERIALIZABLE:最高的隔离级别,严格服从事务的ACID |
timeout | 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。 |
readOnly | 指定事务是否为只读事务,默认为false,如果是true,那么就只能读 |
rollbackFor | 指定发生那些异常可以回滚,默认只支持运行时异常,或者它的子类 |
noRollbackFor | 指定发生那些异常不回滚事务 |
1-3、注意事项
- @Transactional 只能用于public方法
- 在父方法里面加上事务,那么调用子方法抛出异常一样会回滚,比如下面这样的代码
@Transactional(rollbackFor = {Exception.class})
public String exportExcel() throws IOException {
testMapper.insertOne((int)(Math.random()*100));
fun();
return "dada";
}
public void fun(){
testMapper.insertTwo((int)(Math.random()*100));
fun1();
}
public void fun1(){
testMapper.insertTwo((int)(Math.random()*100));
int i = 1 / 0;
}
- 在子方法里面加上事务注解,是无效的,比如下面这样的
public String exportExcel() throws IOException {
testMapper.insertOne((int)(Math.random()*100));
fun();
return "dada";
}
@Transactional(rollbackFor = {Exception.class})
public void fun(){
testMapper.insertTwo((int)(Math.random()*100));
fun1();
}
@Transactional(rollbackFor = {Exception.class})
public void fun1(){
testMapper.insertTwo((int)(Math.random()*100));
int i = 1 / 0;
}
二、手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
在回滚事务之前,我们依旧要使用 @Transactional 注解开启事务。
我们手动回滚事务的时候,就不需要在意是出现了什么异常,只要在这个事务内执行了回滚代码即可。
注:开启事务也还是应当在父方法里面的
下面代码中的 try catch 任选一个都可以对事物进行回滚,但是开启事务的注解只能在父方法这里,
@Transactional
public String exportExcel() {
testMapper.insertOne((int)(Math.random()*100));
fun();
try {
throw new IOException("243");
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return "dada";
}
public void fun() {
testMapper.insertTwo((int)(Math.random()*100));
fun1();
try {
throw new IOException("243");
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
public void fun1() {
testMapper.insertTwo((int)(Math.random()*100));
try {
throw new IOException("243");
}catch (Exception e){
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}