一、spring事务的传播机制(HibernateTransactionManager)
1)、<tx:method name="*" propagation="REQUIRED" /> 如果当前没有事务,就新建一个事务;如果已存在一个事务,就加入到这个事务中。
2)、<tx:method name="*" propagation="SUPPORTS" /> 支持当前事务,如果当前没有事务,以非事务方式执行。
3)、<tx:method name="*" propagation="MANDATORY" />使用当前事务,如果当前没有事务,则抛出异常。
4)、<tx:method name="*" propagation="REQUIRES_NEW" />新建事务,如果当前存在事务,则把当前事务挂起。
5)、<tx:method name="*" propagation="NOT_SUPPORTED" />以非事务方式执行,如果当前存在事务,则把当前事务挂起。
6)、<tx:method name="*" propagation="NEVER" />以非事务方式执行,如果当前存在事务,则抛出异常。
7)、<tx:method name="*" propagation="NESTED" />如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 与 PROPAGATION_REQUIRED 类似的操作。
二、spring事务隔离级别(Isolation Level)
1)、Serializable: 事务串行执行,提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行,资源消耗最大。
2)、Repeatable Read:可重复读取,保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据,避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损耗。
3)、Read Committed:授权读取,大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已经修改但未提交的数据,避免了“脏读取”。
4)、Read Uncommitted:未授权读取,保证读取过程中不会读到方法数据,隔离级别在于处理多事务并发问题。该隔离级别可以通过 “排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。
5)、隔离级别 更新丢失 脏读取 重复读取 幻读
Read Uncommitted N Y Y Y
Read Committed N N Y Y
Repeatable Read N N N Y
Serializable N N N N