Mysql在修改完数据后,默认会自动触发事务Commit提交。
而在我们服务的一个方法里,需要多次修改Mysql记录。
为了保证原子性,我们需要将Mysql设为手动提交,多次修改后再commit提交。
| TransactionTemplate三组件 | |
|---|---|
| PlatformTransactionManager | 事务管理器,用于管理事务的开始、提交和回滚。 |
| TransactionDefinition | 事务定义,用于定义事务的隔离级别、超时时间、只读等。 |
| TransactionCallback | 事务回调,用于执行具体的业务逻辑。 |
private TransactionTemplate transactionTemplate;
public void MyTransaction() {
transactionTemplate.execute((status -> {
try {
//todo
return null;
} catch (Exception e){
status.setRollbackOnly();
}
return null;
}));
}
@Autowired
private PlatformTransactionManager transactionManager;
public void testTransaction() {
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
//代码实现
transactionManager.commit(transactionStatus);
} catch (Exception e) {
transactionManager.rollback(transactionStatus);
}
}
@Transactional(propagation = Propagation.REQUIRED)
public void MyMethod {
//你的业务代码
}
假如我们的事务方法,修改了某些数据。
但是!!!里面还调用了另一个事务方法,那该怎么处理???
我们是要将当它们当成一个事务?还是两个事务??
Spring提供了七种策略,可以让我们去选择。
| 事务的传播机制 | |
|---|---|
| PROPAGATION_REQUIRED | 支持当前事务,如果当前没有事务,就新建一个事务。(默认)。 |
| PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
| PROPAGATION_MANDATORY | 支持当前事务,如果当前没有事务,就抛出异常。 |
| PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
| PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
| PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
| PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 |