SPRING的事务传播特性学习整理标记
2017-06-07 16:04
288 查看
T1:
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
T2:
链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
来源:牛客网
这是我在spring 3 API中看到的,然后自己翻译了一下,但是对于事务同步范围这个不是很懂,有知道的欢迎在下面评论,感谢!
支持一个当前事务;如果不存在,创建一个新的。
This is typically the default setting of a transaction definition, and typically defines a transaction synchronization scope.
默认设置,后面的不懂
支持当前事务;如果不存在当前事务则执行非事务。
不执行当前事务;而是总是执行非事务
创建一个新的事务,如果存在当前事务的话暂停(挂起)当前事务 。
如果当前存在事务的话,执行一个嵌套的事务
不支持当前事务;如果存在当前事务则抛出一个异常
支持当前事务;如果不存在当前事务则抛出一个异常
特别注意的是:PROPAGATION_NESTED:嵌套事务可以独立于当前事务单独的提交或回归,不一定非要与当前事务同步提交或回滚。
T3:
链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
来源:牛客网
事务属性的种类: 传播行为、隔离级别、只读和事务超时
a)
传播行为定义了被调用方法的事务边界。
b)
隔离级别
在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:
c)
只读
如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。
d)
事务超时
如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
T2:
链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
来源:牛客网
这是我在spring 3 API中看到的,然后自己翻译了一下,但是对于事务同步范围这个不是很懂,有知道的欢迎在下面评论,感谢!
PROPAGATION_REQUIRED
Support a current transaction; create a new one if none exists.支持一个当前事务;如果不存在,创建一个新的。
This is typically the default setting of a transaction definition, and typically defines a transaction synchronization scope.
默认设置,后面的不懂
PROPAGATION_SUPPORTS
Support a current transaction; execute non-transactionally if none exists.支持当前事务;如果不存在当前事务则执行非事务。
PROPAGATION_NOT_SUPPORTED
Do not support a current transaction; rather always execute non-transactionally.不执行当前事务;而是总是执行非事务
PROPAGATION_REQUIRES_NEW
Create a new transaction, suspending the current transaction if one exists.创建一个新的事务,如果存在当前事务的话暂停(挂起)当前事务 。
PROPAGATION_NESTED
Execute within a nested transaction if a current transaction exists如果当前存在事务的话,执行一个嵌套的事务
PROPAGATION_NEVER
Do not support a current transaction; throw an exception if a current transaction exists.不支持当前事务;如果存在当前事务则抛出一个异常
PROPAGATION_MANDATORY
Support a current transaction; throw an exception if no current transaction exists.支持当前事务;如果不存在当前事务则抛出一个异常
特别注意的是:PROPAGATION_NESTED:嵌套事务可以独立于当前事务单独的提交或回归,不一定非要与当前事务同步提交或回滚。
T3:
链接:https://www.nowcoder.com/questionTerminal/1c65d30e47fb4f59a5e5af728218cac4
来源:牛客网
事务属性的种类: 传播行为、隔离级别、只读和事务超时
a)
传播行为定义了被调用方法的事务边界。
传播行为 | 意义 |
PROPERGATION_MANDATORY | 表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常 |
PROPAGATION_NESTED | 表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样 |
PROPAGATION_NEVER | 表示方法不能运行在一个事务中,否则抛出异常 |
PROPAGATION_NOT_SUPPORTED | 表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起 |
PROPAGATION_REQUIRED | 表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务 |
PROPAGATION_REQUIRES_NEW | 表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起 |
PROPAGATION_SUPPORTS | 表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中 |
b)
隔离级别
在操作数据时可能带来 3 个副作用,分别是脏读、不可重复读、幻读。为了避免这 3 中副作用的发生,在标准的 SQL 语句中定义了 4 种隔离级别,分别是未提交读、已提交读、可重复读、可序列化。而在 spring 事务中提供了 5 种隔离级别来对应在 SQL 中定义的 4 种隔离级别,如下:
隔离级别 | 意义 |
ISOLATION_DEFAULT | 使用后端数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMITTED | 允许读取未提交的数据(对应未提交读),可能导致脏读、不可重复读、幻读 |
ISOLATION_READ_COMMITTED | 允许在一个事务中读取另一个已经提交的事务中的数据(对应已提交读)。可以避免脏读,但是无法避免不可重复读和幻读 |
ISOLATION_REPEATABLE_READ | 一个事务不可能更新由另一个事务修改但尚未提交(回滚)的数据(对应可重复读)。可以避免脏读和不可重复读,但无法避免幻读 |
ISOLATION_SERIALIZABLE | 这种隔离级别是所有的事务都在一个执行队列中,依次顺序执行,而不是并行(对应可序列化)。可以避免脏读、不可重复读、幻读。但是这种隔离级别效率很低,因此,除非必须,否则不建议使用。 |
c)
只读
如果在一个事务中所有关于数据库的操作都是只读的,也就是说,这些操作只读取数据库中的数据,而并不更新数据,那么应将事务设为只读模式( READ_ONLY_MARKER ) , 这样更有利于数据库进行优化 。
因为只读的优化措施是事务启动后由数据库实施的,因此,只有将那些具有可能启动新事务的传播行为 (PROPAGATION_NESTED 、 PROPAGATION_REQUIRED 、 PROPAGATION_REQUIRED_NEW) 的方法的事务标记成只读才有意义。
如果使用 Hibernate 作为持久化机制,那么将事务标记为只读后,会将 Hibernate 的 flush 模式设置为 FULSH_NEVER, 以告诉 Hibernate 避免和数据库之间进行不必要的同步,并将所有更新延迟到事务结束。
d)
事务超时
如果一个事务长时间运行,这时为了尽量避免浪费系统资源,应为这个事务设置一个有效时间,使其等待数秒后自动回滚。与设
置“只读”属性一样,事务有效属性也需要给那些具有可能启动新事物的传播行为的方法的事务标记成只读才有意义。
相关文章推荐
- spring学习笔记(一)事务的管理和传播特性
- 通过TransactionDefinition接口来学习spring事务的隔离级别和传播特性(4.3.4版本)
- Spring事务的传播特性和隔离级别
- Spring中tx标签中propagation(事务传播特性)和isolation(数据库隔离级别)值的意思
- Spring事务传播特性实例解析
- Spring事务传播特性
- 【原创】spring中的事务传播特性
- spring 事务的传播特性
- Spring事务传播特性实例解析(转)
- spring的事务的传播特性
- Spring事务传播特性实例解析
- spring事务传播特性
- spring学习笔记11--事务传播
- Spring事务传播特性实例解析
- Spring事务传播特性总结
- 事务的传播特性及spring声明式事务
- Spring事务的传播特性
- spring事务传播特性,即spring管理事务的策略
- Spring事务传播特性
- 七种Spring事务传播特性