Spring 事务传播
Spring 支持的事务粒度是方法级别。
如果事务方法 methodA() 中调用了 事务方法 methodB(),就要针对特定的场景,告诉 spring 这两个事务是如何作用的。
两个事务的作用机制,就是事务的传播机制。
不过 spring 的事务传播,主要看 methodB() 的事务如何处理,这里还包含 methodA() 没有事务的情况
spring 事务传播属性(TransactionDefinition)
属性 |
值 |
含义 |
PROPAGATION_REQUIRED |
0 |
如果当前没有事务,就新建一个;如果有,就将自己加入当前的事务。这个是默认设置 |
PROPAGATION_SUPPORTS |
1 |
如果当前没有事务,那就算了;如果有,就将自己加入当前的事务 |
PROPAGATION_MANDATORY |
2 |
如果当前没有事务,就抛出异常;如果当前有事务,就将自己加入当前的事务 |
PROPAGATION_REQUIRES_NEW |
3 |
如果当前没有事务,就新建一个事务;如果当前有事务,就将当前事务挂起 |
PROPAGATION_NOT_SUPPORTED |
4 |
如果当前没有事务,就正常执行;如果当前有事务,就将当前事务挂起 |
PROPAGATION_NEVER |
5 |
如果当前没有事务,就正常执行;如果当前有事务,就抛出异常 |
PROPAGATION_NESTED |
6 |
如果当前没有事务,就新建一个;如果有,就在嵌套事务里执行 |
ISOLATION_DEFAULT |
-1 |
使用数据库默认的事务传播机制 |
spring 数据库事务隔离级别
属性 |
值 |
含义 |
影响 |
ISOLATION_DEFAULT |
-1 |
使用数据库的事务隔离级别 |
参考下方具体设置 |
TRANSACTION_NONE |
0 |
不使用事务 |
容易丢失数据 |
ISOLATION_READ_UNCOMMITTED |
1 |
能读别人未提交的数据 |
会出现脏读 |
TRANSACTION_READ_COMMITTED |
2 |
只能读别人提交的数据,读的时候,别人可以写,只是没提交的值,你读不到 |
会造成不可重复读 |
TRANSACTION_REPEATABLE_READ |
4 |
可重复读,即读的时候别人不允许修改,但是别人可以插入值 |
会有幻读 |
TRANSACTION_SERIALIZABLE |
8 |
序列化,可以认为是单线程 |
性能太低 |