第5章 Spring的事务管理
5.1 Spring事务管理概述
事务管理:将若干的数据库操作作为一个整体控制,一起成功或一起失败(用来确保数据的完整性和一致性)
领钱两个步骤:银行卡扣掉1000元钱,然后ATM出1000元钱。这两个步骤必须是都执行或都不执行
事务具备ACID四种特性:
1.原子性(Atomic):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性(Consistency):指事务前后数据的完整性必须保持一致
3.隔离性(Isolation):指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离
4.持久性(Durability):指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,即时数据库发生故障也不应该对其有任何影响
5.1.1 事务管理的核心接口
1.PlatformTransactionManager接口:是Spring提供的平台事务管理器,主要用于管理事务
该接口中提供了3个事务操作的方法,具体如下:
(1)TransactionStatus getTransaction(TransactionDefinition definition):用于获取事务状态信息
(2)void commit(TransactionStatus status):用于提交事务
(3)void rollback(TransactionStatus status):用于回滚事务
注意:在上面的3个方法中,getTransaction(TransactionDefinition definition)方法会根据TransactionDefinition参数返回一个TransactionStatus对象,TransactionStatus对象就表示一个事务,它被关联在当前执行的线程上
PlatformTransactionManager接口只是代表事务管理的接口,它并不知道底层是如何管理事务的,它只需要事务管理提供上面的3个方法,但具体如何管理事务则由它的实现类来完成
PlatformTransactionManager接口由许多不同的实现类,常见的几个实现类如下:
(1)org.springframework.jdbc.datasource.DataSourceTransactionManager:用于配置JDBC数据源的事务管理器
(2)org.springframework.orm.hibernate4.HibernateTransactionManager:用于配置Hibernate的事务管理器
(3)org.springframework.transaction.jta.JtaTransactionManager:用于配置全局事务管理器
注意:当底层采用不同持久层技术时,系统只需使用不同的PlatformTransactionManager实现类即可
2.TransactionDefinition接口:是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法,具体如下:
(1)String getName():获取事务对象名称
(2)int getlsolationLevel:获取事务隔离级别
(3)int getPropagationBehavior:获取事务的传播行为
(4)int getTimeout():获取事务的超时时间
(5)boolean isReadOnly():获取事务是否只读
上述方法中,事务的传播行为是指在同一个方法中,不同操作前后所使用的事务。传播行为有很多种,具体如下:
事务传播行为:用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。通常情况下,数据的查询不会影响原数据的改变,所有不需要进行事务管理,而对于数据的插入,更新和删除操作,必须进行事务管理。如果没有指定事务管理的传播行为,Spring默认传播行为是REQUIRED
Spring事务传播行为推荐文章:https://www.cnblogs.com/alimayun/p/10933289.html
3.TransactionStatus接口:是事务的状态,它描述了某一时间点上事务的状态信息,该接口中包含6个方法,具体如下:
(1)void flush:刷新事务
(2)boolean hasSavepoint():获取事务是否完成
(3)boolean isCompleted():获取事务是否完成
(4)boolean isNewTransaction():获取是否是新事物
(5)boolean isRollbackOnly():获取是否回滚
(6)void setRollbackOnly():设置事务回滚
5.1.2 Spring事务中的隔离级别
Spring事务中的隔离级别推荐文章:https://www.cnblogs.com/shaozhen/p/11121553.html
5.2 声明式事务管理
5.2.1基于XML方式的声明式事务
基于XML方式的声明式事务管理:是通过在配置文件中配置事务规则的相关声明来实现的
基于XML方式的声明式事务推荐文章:http://c.biancheng.net/view/4287.html
tx命名空间来配置事务:tx命名空间下提供了tx:advice元素来配置事务的通知(增强处理)。当使用tx:advice元素配置了事务的增强处理后,就可以通过编写的AOP配置,让Spring自动对目标生成代理
配置tx:advice元素时,通常需要指定id和transaction-manager属性,其中id属性是配置文件中的唯一标识,transaction-manager属性用于指定事务管理器。除此之外,还需要配置一个tx:attributes子元素,该子元素可通过配置多个tx:method子元素来配置执行事务的细节
关于tx:mothod元素的属性描述如下:
属性名称 | 描述 |
---|---|
id | 唯一标识符 |
transaction-manager | 用于指定事务管理器 |
name | 用于指定对哪些方法起作用,该属性为必选属性 |
propagation | 用于指定事务的传播行为,默认值为REQUIRED |
isolation | 用于指定事务的隔离级别 |
read-only | 该属性用于指定事务是否只读,其默认值为false |
timeout | 用于指定事务超时的时间,其默认值为-1,即永不超时 |
rollback-for | 用于指定异常回滚,在指定多个异常类时,异常类之间以英文逗号分隔 |
no-rollback-for | 用于指定异常不回滚,在指定多个异常类时,异常类之间以英文逗号分隔 |
5.2.2 基于Annotation方式的声明式事务
Annotation(注解)的方式实现的两步骤:
1.在Spring容器中注册事务注解驱动,其代码如下:
<tx:ann0tation-driven transaction-manager="transactionManager">
2.在需要使用的事务的Spring Bean类或者Bean类的方法上添加注解@Transactional
如果将注解添加在Bean类上,则表示事务的设置对整个Bean类的所有方法都起作用;如果将注解添加到Bean类中的某个方法上,则表示事务的设置只对该方法有效
使用@Transactional注解时,可以通过其参数配置事务详情:
参数名称 | 描述 |
---|---|
value | 用于指定需要使用的事务管理器,默认"",其别名为transactionManager |
transactionManager | 指定事务的限定符值,可用于确定目标事务管理器,匹配特定的限定值(或者Bean的name值),默认为"",其别名为value |
isolation | 用于指定事务的隔离级别,默认为lsolation.DEFAULT(即底层事务的隔离级别) |
noRollbackFor | 用于指定遇到特定异常时强制不回滚事务 |
noRollbackForClassName | 用于指定遇到特定的多个异常时强制不回滚事务。其属性值可以指定多个异常类名 |
propagation | 用于指定事务的传播行为,默认为propagation。REQUIRED |
read-only | 用于指定事务是否只读,默认为false |
rollbackFor | 用于指定遇到特定异常时强制回滚事务 |
rollbackForClassName | 用于指定遇到特定的第一个异常时强制回滚事务,其属性值可以指定多个异常类名 |
itmeout | 用于指定事务的超时时长,默认为TransactionDefinition.TIMEOUT_DEFAULT(即底层事务系统的默认时间) |
注意:在实际开发中,事务的配置信息通常在Spring的配置文件中完成的,而在业务层类上只需使用@Transactional注解即可,不需要配置@Transactional注解的属性
基于Annotation方式的声明式事务推荐文章:https://www.cnblogs.com/best-lwj/articles/9218671.html