Spring事务管理

来源:互联网 发布:精品营销软件 编辑:程序博客网 时间:2024/06/06 03:44
事务的API介绍


一、Spring事务管理包括三个接口
PlatformTransactionManager - 平台事务管理器,真正用来管理事务的接口,包含事务的提交,回滚等信息
TransactionDefinition - 事务定义信息(隔离级别、传播行为、是否超时、设置只读)
TransactionStatus - 事务具体的运行状态(是否已经提交,是否有保存点,是不是一个新的事务等等这些状态)


关系:
首先会根据TransactionDefinition事务定义的信息(比如定义了什么样的隔离级别,定义什么样的传播行为),由PlatformTransactionManager对事务进行管理,进行事务管理的过程中,事务会产生一些相应的状态,这些状态在TransactionStatus中


二、PlatformTransactionManager 
Spring根据不同的持久化框架提供不同 PlatformTransactionManager接口实现
1. org.springframework.jdbc.datasource.DataSourceTransactionManager
     使用Spring JDBC 或iBatis进行持久化数据时使用
2. org.springframework.orm.hibernate3.HibernateTransactionManager
     使用Hibernate3.0版本进行持久化数据时使用


三、TransactionDefinition
1.事务隔离级别


作用:为了解决脏读、不可重复读、幻读等安全问题


脏读:一个事务读取了另一个事务改写但未提交的数据,如果这些数据被回滚,则读到的数据是无效的


不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同


幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录

事务隔离级别(四种):
DEFAULT    使用后端数据库默认的隔离级别(Spring中的选择项)
READ_UNCOMMITED    允许你读取还未提交的但是改变了的数据。可能导致脏读,幻读,不可重复读
READ_COMMITED    允许在并发事务已经提交后读取。可防止脏读,但是幻读,不可重复读仍可发生
REPEATABLE_READ    对于相同的字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可能发生。
SERIALIZABLE    完全服从ACID的隔离级别,确保不会发生脏,幻,不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的


    Mysql默认的隔离级别 REPEATABLE_READ
    Oracle默认的隔离级别 READ_COMMITED


2.事务的传播行为 - 解决业务层的方法之间的相互调用的问题(在调用方法的过程中,事务是如何传递的)


事务的传播行为有七种,又分为三类:
第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。
PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务,即:A和B方法在同一个事务中。
PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。
PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。


第二类共同点:A 方法和 B 方法不在同一个事务里面。
PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。
PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。
PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。


第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。
PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行


重点的三种:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED


四、TransactionStatus

该接口定义了一组方法,用来获取或判断事务的相应状态信息
0 0
原创粉丝点击