使用 synchronized 为操作数据库方法加锁,避免并发操作,然而为方法外加上事务注解 @Transactional 则无法完全避免并发操作,原因如下:
synchronized 是针对 方法的锁 而 事务注解是 针对方法的环绕处理 即在方法运行前开启事务 方法结束后提交事务

    getTransaction();
    process();
    commitTransaction();
    process的锁并不能约束事务的方法 于是 出现了 其他线程获取锁的时候 事务还没提交的情况 产生并发问题
    

解决方法是 将事务的获取和提交方法手动写入 process 方法中 使其纳入process 锁的约束

@Autowired
private PlatformTransactionManager platformTransactionManager;
@Autowired
private TransactionDefinition transactionDefinition;

// 开启事务
TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);
// do something.
// 提交事务
platformTransactionManager.commit(transaction);

Fox_Valentin
1 声望1 粉丝