使用 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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。