Spring事务管理 —— @Transactional
- Dominant language
- No language data
- Stars
- 1
- Forks
- 0
- PR merge metrics
- No merged PRs in 30d
Description
对`Java`相关知识进行总结,涉及`框架`,`源码`,`项目开发`,`设计模式`,`并发设计`等。
## 框架
### 注解
#### `@Transactional`——Spring事务管理
> 注解失效情况:
- 不要在接口上声明`@Transactional`,而要在具体类的方法上使用`@Transactional`注解,否则注解可能无效;
- 使用了`@Transactional`的方法,必须是public;因为`@Transactional`注解的方法被外部其他类调用才有效。如果在 protected、private 或者 package-visible 的方法上使用了 `@Transactional `,不会报错,但事务无效;
- 使用了`@Transactional`的方法,被同一个类里面的方法调用,`@Transactional`无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。
> 使用场景:
- 不应该将`@Transactional`放置在类级的声明中,如果放在类声明,会使得该类下的所有方法都有事务。一般在service里加`@Transactional`注解,不建议在接口上添加。加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。
- `@Transactional`应该放在方法级别,对于不需要使用事务的方法,就不要放置事务,比如查询方法,否则对性能是有影响的。启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。
```java
//service层
@Transactional
@CacheEvict(allEntries = true)
@Override
public int updatePassword(Integer tid, String password) {
return teacherMapper.updatePassword(tid, password);
}
```
> 事务回滚:
- 抛出受查异常checked Exception,事务不会回滚;如果是checked异常也想回滚的话,注解上写明异常类型即可;
```java
@Transactional(rollbackFor=Exception.class)
```
- 抛出运行时异常 unchecked Exception,事务进行回滚;
- Quartz中,execute直接调用加了`@Transactional`方法,可以回滚;间接调用,不会回滚。(即注解失效第3点提到的)
- 异步任务中,execute直接调用加了`@Transactional`方法,可以回滚;间接调用,不会回滚。(即注解失效第3点提到的)
- 在action中加上`@Transactional`,不会回滚。切记不要在action中加上事务
- 在service中加上`@Transactional`,如果是action直接调用该方法,会回滚,如果是间接调,不会回滚。
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.