事务控制分为编程式和声明式
编程式: 使用java的API去写代码,也就是原生写法 声明式: 以配置的方式去写代码,也就是被spring整合了的写法
下面我们会介绍编程式事务控制的三大对象,注意编程式不需要我们着重掌握,只需要记得各个对象的API就行,重要的是下节课a_23_0的声明式事务控制
1、PlatformTransactionManager
2、TransactionDefinition
3、TransactionStatus
这节课下面的记就行,下节课的'声明式事务控制'才是需要敲代码
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是事务的定义对象,定义的是事务的属性信息,内部维护的是事务的相关参数。它提供的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接口提供的是事务具体的运行状态。内部维护的是在不同的时间点,事务的状态信息。它提供的API方法如下
方法 | 作用 |
---|---|
boolean hasSavepoint() | 是否存储回滚点 |
boolean isCompleted() | 事务是否完成 |
boolean isNewTransaction() | 是否是新事务 |
boolean isRollbackOnly() | 事务是否回滚 |