Spring 事务管理

事务回顾什么是事务?

事务指的是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

事务的特性

原子性:是指事务是一个不可分割的工作单位,事务中的操作要么都发送,要么都不发生。

一致性:指事务前后数据的完整性必须保持一致。

隔离性:隔离性指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要互相隔离。

持久性:是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即使数据库发送故障也不应该对其有任何影响。

事务 API 介绍PlatformTransactionManager 事务管理器TransactionDefinition 事务定义信息(隔离、传播、超时、只读)

如果不考虑隔离性,会引发如下的安全问题:

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

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

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

隔离级别的出现就是为了解决以上问题的。

数据库提供的事务的隔离级别(四种):

READ_UNCOMMITED:允许你读取还未提交的改变了的数据,可能导致脏,幻,不可重复读。

READ_COMMINTED: 允许在并发事务已经提交后读取,可防止脏读,但幻读和不可重复读还是有可能发生。

REPEATABLE_READ: 对相同字段的多次读取是一致的,除非数据被事务本身改变,可防止脏读,不可重复读,但幻读仍有可能出现。

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

除了以上的数据库提供的事务隔离级别,spring提供了Default隔离级别,该级别表示spring使用后端数据库默认的隔离级别。

默认事务隔离级别: (可能出现幻读) 默认: (可能出现不可重复读和幻读)

TransactionDefinition 定义事务传播行为

事务的传播行为:主要是解决业务层方法之间的相互调用的问题。Spring定义了7种事务的传播行为,可以分为3类:

是让整个业务处于一个事务当中 , ,

是让业务不处于同一个事务当中 , ,

是嵌套事务的执行,嵌套事务可以在第一个事务执行完毕时设置一个保存点,然后第二个业务操作发生异常时可以选择回滚到保存点,也可以回滚到初始状态。

TransactionStatus 事务具体运行状态

接口用来记录事务的状态,该接口定义了一组方法,用来获取或判断事务的相应状态信息.平台事务管理器(PlatformTransactionManager)会根据 TransactionDefinition 中定义的事务信息(包括隔离级别、传播行为)来进行事务的管理,在管理的过程中事务可能产生了保存点或事务是新的事务等情况,那么这些信息都会记录在 TransactionStatus 的对象中.

编程式事务管理

为了简化设置事务的代码量,提供了TransactionTemplate事务管理模版类.在哪个地方需要用到事务,那么就在哪个地方注入这个模版.真正进行事务管理是由事务管理器来完成.

配置事务管理器:TranscationManager,一般在不适用Hibernate的情况下,使用DataSourceTranscationManager,需要注入数据源

配置事务管理器的事务管理的模板TransactionTemplate依赖于DataSourceTransactionManager数据源事务管理器(PlatformTransactionManager平台事务管理器的实现类).

配置文件中引入TransactionTemplate类,把数据源事务管理器对象注入到使用的事务的service层的类中,作为该bean的transactionManager属性.DataSourceTransactionManager数据源管理器又依赖于DataSource.因此把数据源对象注入到数据源管理器的dataSource属性中.

在service中,要定义一个TransactionTemplate的成员变量,并生成set()方法.因此要把TransactionTemplate的bean注入到Service实体类中的TransactionTemplate类型的属性中。 执行transcationTemplate提供的execute方法,方法中进行事务的操作,这个方法中有个参数,transcationcallback,如果事务出现回滚,将会调用这个参数进行操作。如果匿名内部类要拿到外层包裹它的方法的参数,那么要将参数修饰成final

这里调用模板方法将两个dao操作放在一个事务里。

声明式事务管理基于 TransactionProxyFactoryBean 的声明式事务管理(创建代理对象)

基于 AspectJ 的XML方式基于注解的方式

总结

Spring将事务管理分成了两类:

案例代码:https://github.com/wave-gbt/spring-transaction-demo

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180117G030YP00?refer=cp_1026

扫码关注云+社区