Spring事务的三大组件
一。platformTransactionManager 事务管理器:负责得到事务状态,提交、回滚事务。
二。TransactionStatus事务状态: 提供了控制事务执行和查询事务状态的方法
三。TransactionDefinition 事务属性定义
1.隔离性:ISOLATION
①读未提交:当前事务可以读取未提交的数据
②读已提交:当前事务只能读取已提交的数据
③可重复读:当前事务内读取统一数据前后值不变
④串行化: 当前事务内读取同一批次数据,不会幻读。
⑤默认隔离级别:与数据库一致;mysql可重复读,oracle读已提交
2.传播性:PROPAGATION
①REQUIRED: 当前方法存在事务则加入事务,不存在则新建事务
②REQUIRES_NEW: 当前方法存在事务,仍然新建一个事务并将当前事务挂起。如果外层事务回滚,当前方法事务不会回滚。如果当前事务异常抛出到外层事务了,但是外层事务捕获了异常,外层事务不会回滚,否则外层事务也会回滚。
③NESTED: 当前方法存在事务则创建一个子事务,否则创建新事物。如果外层事务回滚,则子事务必定回滚。如果子事务异常抛出到外层事务了,但是外层事务捕获了异常,外层事务不会回滚,否则外层事务也会回滚。
④MANDATORY: 如果当前事务存在事务则加入事务,如果不存在事务则会报错。
⑤SUPPORTS: 如果当前事务存在事务则加入事务, 如果不存在事务则继续运行
⑥NOT_SUPPORTED: 如果当前事务存在事务则将当前事务挂起,自己以非事务方式运行。
⑦NEVER: 如果当前不存在事务则正常运行,如果存在事务则报错。
3.回滚规则:rollbackFor,noRollbackFor
默认只有运行时异常才会回滚,可以通过rollbackFor参数指定异常回滚,或者通过noRollbackFor参数指定异常不回滚
4.是否只读:readOnly
将多个查询sql放入同一个事务中,可满足重复读
5.超时时间:timeOut
如果超过该时间仍未执行完成则会回滚,默认是数据库超时时间
注意:
①事务只能用到public方法中
②同一个类中非事务方法调用事务方法事务会失效,因为事务是基于aop实现的,内部调用无法进入切面
编程式事务
/**
* 事务管理器
*/
@Resource
static PlatformTransactionManager platformTransactionManager;
/**
* 事务模板
*/
@Resource
static
TransactionTemplate transactionTemplate;
public static void main(String[] args) {
//定义事务属性:隔离性,传播性等
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
//设置隔离级别
defaultTransactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
//设置传播性
defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//设置超时时间
defaultTransactionDefinition.setTimeout(3000);
//设置是否只读
defaultTransactionDefinition.setReadOnly(true);
//获取事务对象
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(defaultTransactionDefinition);
//设置回滚规则
transactionStatus.setRollbackOnly();
//事务提交
platformTransactionManager.commit(transactionStatus);
//事务回滚
platformTransactionManager.rollback(transactionStatus);
//使用事务模板
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
//默认事务提交,事务回滚
transactionStatus.setRollbackOnly();
return null;
}
});
}
声明式事务
/**
* 基于aop实现的声明式事务
*/
@Configuration
@EnableTransactionManagement
public class DeclarationTransaction {
@Transactional(isolation = Isolation.DEFAULT,
propagation = Propagation.REQUIRED,
timeout = 3000,
rollbackFor = Exception.class,
readOnly = false)
public void test() {
}
}