Spring事务管理机制

Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的:

  1. PlatformTransactionManager:事务管理器—主要用于平台相关事务的管理
  2. TransactionDefinition:  事务定义信息(隔离、传播、超时、只读)—通过配置如何进行事务管理。
  3. TransactionStatus:事务具体运行状态—事务管理过程中,每个时间点事务的状态信息。
  1. PlatformTransactionManager事务管理器

该接口提供三个方法:

  1. commit:提交事务
  2. rollback:回滚事务
  3. getTransaction:获取事务状态

 

Spring为不同的持久化框架提供了不同PlatformTransactionManager接口实现,

用户根据选择和使用的持久层技术,来选择对应的事务管理器。

  1. org.springframework.jdbc.datasource.DataSourceTransactionManager

使用Spring JDBC或iBatis 进行持久化数据时使用

  1. org.springframework.orm.hibernate5.HibernateTransactionManager      

使用Hibernate5.0版本进行持久化数据时使用

  1. org.springframework.orm.jpa.JpaTransactionManager      

使用JPA进行持久化时使用

  1. org.springframework.jdo.JdoTransactionManager     

当持久化机制是Jdo时使用

  1. org.springframework.transaction.jta.JtaTransactionManager  

使用一个JTA实现来管理事务,在一个事务跨越多个资源时必须使用

  1. DataSourceTransactionManager针对JdbcTemplate、MyBatis 事务控制,使用Connection(连接)进行事务控制 :

开启事务 connection.setAutoCommit(false);

提交事务 connection.commit();

回滚事务 connection.rollback();

try{

Con.setAutoCommit(false)

//做多条DML操作--调用了service中的一个方法  trans()

Con.commit();

Con.setAutoCommit(true);

}catch(){

Con.rollback();

}finally{

//关闭资源

}

 

2、TransactionDefinition事务定义信息

用来定义事务相关的属性的,给事务管理器用。

该接口主要提供的方法:

  1. getIsolationLevel:隔离级别获取
  2. getPropagationBehavior:传播行为获取
  3. getTimeout:获取超时时间(事务的有效期)
  4. isReadOnly 是否只读(保存、更新、删除—对数据进行操作-变成可读写的,查询-设置这个属性为true,只能读不能写),事务管理器能够根据这个返回值进行优化。

这些事务的定义信息,都可以在配置文件中配置和定制。

 

3、事务的隔离级别IsolationLevel

(1)DEFAULT         使用后端数据库默认的隔离级别(spring中的的选择项)

(2)READ_UNCOMMITED   允许你读取还未提交的改变了的数据。可能导致脏、幻、不可重复读(Oracle默认)

         Update User set username=’Tom’ where id=’1’  

    Commit;  rollback;

B

         Select * from user where id=’1’

 

(3)READ_COMMITTED      允许在并发事务已经提交后读取。可防止脏读,但幻读和 不可重复读仍可发生

 

(4)REPEATABLE_READ        对相同字段的多次读取是一致的,除非数据被事务本身改变。可防止脏、不可重复读,但幻读仍可能发生。(MySQL默认)

(5)SERIALIZABLE         完全服从ACID的隔离级别,确保不发生脏、幻、不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的。

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

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

A:Select  * from user  uid=1

B:update  user  set xxx where uid=1

A:Select  * from user  uid=1

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

A:Select  * from user

B:insert into user

A:Select  * from user

 

  1. 事务的传播行为PropagationBehavior

事务传播行为用于解决两个被事务管理的方法互相调用问题

* 有些时候需要处于同一个事务(删除用户删除完成之后,需要同时删除用户对应的订单,需要事务回滚,例如商场工作人员删除订单业务),

    * 有些时候不能在同一个事务(取款是一个事务操作,打印凭条是一个事务操作,例如ATM取款业务) !

(1)PROPAGATION_REQUIRED   支持当前事务,如果不存在 就新建一个

(2)PROPAGATION_SUPPORTS    支持当前事务,如果不存在,就不使用事务

(3)PROPAGATION_MANDATORY        支持当前事务,如果不存在,抛出异常

(4)PROPAGATION_REQUIRES_NEW  如果有事务存在,挂起当前事务,创建一个新的事务

(5)PROPAGATION_NOT_SUPPORTED         以非事务方式运行,如果有事务存在,挂起当前事务

(6)PROPAGATION_NEVER           以非事务方式运行,如果有事务存在,抛出异常

(7)PROPAGATION_NESTED         如果当前事务存在,则嵌套事务执行,只对DataSourceTransactionManager 起效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值