应用 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);