事务控制的简介

 

事务控制分为编程式和声明式

编程式: 使用java的API去写代码,也就是原生写法 声明式: 以配置的方式去写代码,也就是被spring整合了的写法

 

下面我们会介绍编程式事务控制的三大对象,注意编程式不需要我们着重掌握,只需要记得各个对象的API就行,重要的是下节课a_23_0的声明式事务控制

1、PlatformTransactionManager

2、TransactionDefinition

3、TransactionStatus

这节课下面的记就行,下节课的'声明式事务控制'才是需要敲代码

 

编程式事务控制的对象 -- PlatformTransactionManager

 

PlatformTransactionManager接口,是spring的平台事务管理器,作用是提供常用的操作事务的API方法,如下

方法作用
TransactionStatus getTransaction(TransactionDefination defination)获取事务的状态信息
void commit(TransactionStatus status)提交事务
void rollback(TransactionStatus status)回滚事务

 

注意:PlatformTransactionManager对象是接口类型的,不同的Dao层技术则有不同的实现类,例如如下

1、Dao层技术是jdbc或mybatis时: 实现类是org.springframework.jdbc.datasource.DataSourceTransactionManager

2、Dao层技术是hibernate时: 实现类是org.springframework.orm.hibernate5.HibernateTransactionManager 我们在使用PlatformTransactionManager对象时,由于它是个接口我们不能直接用,得用它的实现类,用哪个实现类取决于是什么Dao层技术

 

编程式事务控制的对象 -- TransactionDefinition

 

TransactionDefinition是事务的定义对象,定义的是事务的属性信息,内部维护的是事务的相关参数。它提供的API方法如下

方法作用
int getIsolationLevel()获得事务的隔离级别
int getPropogationBehavior()获得事务的传播行为
int getTimeout()获得超时时间
boolean isReadOnly()是否只读

 

设置事务隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读取和虚读

事务隔离级别作用
ISOLATION_DEFAULT默认,例如mysql默认的是可重复读
ISOLATION_READ_UNCOMMITTED读,未提交,不能解决问题
ISOLATION_READ_COMMITTED读,已提交,解决脏读
ISOLATION_REPEATABLE_READ可重复读,解决不可重复读
ISOLATION_SERIALIZABLE串行化,解决所有问题,缺点是性能低

 

 

事务传播行为的种类如下。传播行为的作用是解决业务方法在调用业务方法时,它们之间事务统一性的问题

 

1、REQUIRED: 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就用A的事务,如果A没有事务,则B就自己建一个事务

2、SUPPORTS: 支持当前事务,如果当前没有事务,就以非事务方法执行(没有事务) 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就用A的事务,如果A没有事务,则B就以非事务方式运行

3、MANDATORY: 使用当前的事务,如果当前没有事务,就抛出异常 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就用A的事务,如果A没有事务,则B就报异常

4、REQUERS_NEW: 新建事务,如果当前在事务中,把当前事务挂起 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就挂起(闲置或不用的意思)A的事务,如果A没有事务,则B就自己建一个事务

5、NOT_SUPPORTED: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就用挂起A的事务,如果A没有事务,则B以非事务方式运行

6、NEVER: 以非事务方法运行,如果当前存在事务,抛出异常 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就报异常,如果A没有事务,则B以非事务方式运行

7、NESTED: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作 简单说就是,A业务方法去调用B业务方法,如果A有事务,则B就在嵌套事务内执行,如果A没有事务,则B就自己建一个事务

8、超时时间: 默认值是-1,没有超时限制。如果有,以秒为单位进行设置。例如设置查询时间超过10秒我就不查了 处理不好超时时间的话会引起缓存雪崩,就是缓存在同一时间大面积的失效挂掉了,所以后面的请求都会落在数据库上,造成数据库短时间承受大量请求而崩掉

9、是否只读: 建议查询时设置为只读 如果某个事务只负责查询,那么设置这个事务为只读即可。如果某个事务要负责增删改,那么设置这个事务为读写

 

编程式事务控制的对象 -- TransactionStatus

 

TransactionStatus接口提供的是事务具体的运行状态。内部维护的是在不同的时间点,事务的状态信息。它提供的API方法如下

方法作用
boolean hasSavepoint()是否存储回滚点
boolean isCompleted()事务是否完成
boolean isNewTransaction()是否是新事务
boolean isRollbackOnly()事务是否回滚