Spring 事务记录
一.事务不生效得场景
1.访问权限问题 (只有public方法会生效)
2.方法用final修饰,不会生效
3.同一个类中的方法直接内部调用,会导致事务失效 (spring 事务是基于AOP 类实现的,默认类层的AOP)
4.(类本身) 未被spring管理
5.多线程调用
6.(存储引擎)表不支持事务
7.未开启事务
8.错误的传播特性
9.自己吞了异常
10.手动抛了别的异常
11.自定义了回滚异常
12.嵌套事务回滚多了
13.weblogic 部署未配置数据源(update 回滚正常,insert 回滚失败)
二、事务的隔离级别
1,@Transactional(isolation = Isolation.READ_UNCOMMITTED) 读未提交;
2,@Transactional(isolation = Isolation.READ_COMMITTED) 读已提交
3,@Transactional(isolation = Isolation.SERIALIZABLE) 串行化 该隔离级别会把该方法所涉及到的表全部锁起来,共享锁,其他事务只能查,不能写;
三、事务传播行为
1. TransactionDefinition.PROPAGATION_REQUIRED:
如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:
创建一个新的事务,如果当前存在事务,则把当前事务挂起。
3. TransactionDefinition.PROPAGATION_SUPPORTS:
如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:
以非事务方式运行,如果当前存在事务,则把当前事务挂起。
5. TransactionDefinition.PROPAGATION_NEVER:
以非事务方式运行,如果当前存在事务,则抛出异常。
6. TransactionDefinition.PROPAGATION_MANDATORY:
如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
7. TransactionDefinition.PROPAGATION_NESTED:
如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;
如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。