Spring 对事务的支持
前提是数据库支持事务,读取也建议开启事务,避免出现幻读
两种事务管理方式
- 编程式事务管理:通过
TransactionManager手动执行/提交/回滚,用的较少 - 声明式事务管理:使用
@Transactional注解实现- 可以放到方法(必须 public)或者类上(类中所有 public 方法都生效),不推荐在接口上使用
- 通过 AOP 在实际调用方法前增加开启事务,后增加提交或回滚
- 如果当前类的方法调用另一个方法,事务会失效(不要自己调用自己)
- Spring AOP 会在对象从容器中取出时拦截增加前后置事务,内部调用不走容器,无法生效
- 需要这个类被 Spring 管理,否则也不生效
事务传播行为:解决不同方法间的事务问题
- PROPAGATION_REQUIRED(默认):
- 当前存在事务(调用方启动了),加入该事务
- 否则新建一个事务
- PROPAGATION_REQUIRES_NEW:
- 一定新建一个事务,和外部事务独立
- 但是可以抛出异常给外层,让外层一起回滚
- PROPAGATION_NESTED:
- 如果存在外部事务,开启一个嵌套事务,内部事务回滚不影响外部,外部事务回滚会让内部也回滚
- 否则开启一个独立事务
- PROPAGATION_MANDATORY:
- 如果存在外部事务,加入
- 否则抛出错误
- 还有以非事务运行的方案(用的少)
- 如果存在事务,加入,否则非事务运行
- 无论有无外部事务,当前无事务运行
- 一定以无事务运行,如果存在外部事务,抛出异常
可以配置事务的超时时间,超过自动回滚,默认没有超时时间 还可以配置事务遇到哪些异常会回滚,哪些不会 还可以配置事务为只读,会有一定的优化
