目录
1 Spring事务最佳实践
1.1、Spring事务传播机制
Spring定义了七种传播行为:默认为:PROPAGATION_REQUIRED
传播行为 |
含义 |
---|---|
TransactionDefinition.PROPAGATION_REQUIRED |
如果当前没有事务,就新建一个事务,如果已经存在一个事务,则加入到这个事务中。这是最常见的选择。(默认传播行为) |
TransactionDefinition.PROPAGATION_SUPPORTS |
支持当前事务,如果当前没有事务,就以非事务方式执行。 |
TransactionDefinition.PROPAGATION_MANDATORY |
表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 |
TransactionDefinition.PROPAGATION_REQUIRED_NEW |
表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED |
表示该方法不应该运行在事务中。如果当前存在事务,就把当前事务挂起。 |
TransactionDefinition.PROPAGATION_NEVER |
表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常 |
TransactionDefinition.PROPAGATION_NESTED |
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
传播行为是指:当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。该问题只有一个函数不存在函数之间的调用,故排除传播行为的问题。
1.2、隔离规则
Spring的 isolation用于指定事务的隔离规则,默认值为DEFAULT。总共五种隔离规则,如下所示:
@isolation属性 |
事务属性-隔离规则 |
含义 |
脏读 |
不可重复读 |
幻读 |
---|---|---|---|---|---|
DEFAULT |
TransactionDefinition.ISOLATION_DEFAULT |
使用后端数据库默认的隔离级别 |
|
|
|
READ_UNCOMMITTED |
TransactionDefinition.ISOLATION_READ_UNCOMMITTED |
允许读取尚未提交的数据变更(最低的隔离级别) |
是 |
是 |
是 |
READ_COMMITTED |
TransactionDefinition.ISOLATION_READ_COMMITTED |
允许读取并发事务已经提交的数据 |
否 |
是 |
是 |
REPEATABLE_READ |
TransactionDefinition.ISOLATION_REPEATABLE_READ |
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改 |
否 |
否 |
否 |
SERIALIZABLE |
TransactionDefinition.ISOLATION_SERIALIZABLE |
最高的隔离级别,完全服从ACID的隔离级别,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的 |