0
点赞
收藏
分享

微信扫一扫

@Transactional 注意事项


PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启。

PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务存在,则将这个存在的事务挂起。

PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常。

PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行

PROPAGATION_REQUIRED

无异常 一起提交
有异常 一起回滚
嵌套方法不会提前提交

@Transactional(rollbackFor = Exception.class)
public void updateTask() {
try {
jobTaskService.updateTask2();
}catch (Exception e){

}
YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, one.getNickname() + "22222").update();
}

@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
public void updateTask2() {
userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, "100000").update();
}

PROPAGATION_REQUIRES_NEW

无异常 嵌套方法先提交
有异常 嵌套方法回滚 不影响主方法提交
注意 两个方法在不同的类 否则会不走代理 直接通过this.嵌套方法调用 不走代理 导致注解无效

@Transactional(rollbackFor = Exception.class)
public void updateTask() {
try {
jobTaskService.updateTask2();
}catch (Exception e){

}
YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, one.getNickname() + "1").update();
}

@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public void updateTask2() {
YxUser one = userService.lambdaQuery().eq(YxUser::getPhone, "11111").one();
userService.lambdaUpdate().eq(YxUser::getPhone, "11111").set(YxUser::getNickname, "10011100").update();
throw new RuntimeException("");
}

ReentrantLock lock = new ReentrantLock();

注意事务和锁一起使用

spring的事务提交是在方法结束后执行的 解锁之后可能还没提交 又有线程进入 导致脏读问题

对于高并发加事务问题 可以对事务手动处理

//事务管理器
@Autowired
private PlatformTransactionManager platformTransactionManager;

//默认事务定义
@Autowired
private TransactionDefinition transactionDefinition;

//创建自定义锁
DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
defaultTransactionDefinition.setPropagationBehavior(1);
//开始事务
TransactionStatus transaction = platformTransactionManager.getTransaction(defaultTransactionDefinition);
//事务提交
platformTransactionManager.commit(transaction);
//事务回滚
platformTransactionManager.rollback(transaction);


举报

相关推荐

0 条评论