Spring @Transactional 具有来自不同调用源的不同隔离级别
Posted
技术标签:
【中文标题】Spring @Transactional 具有来自不同调用源的不同隔离级别【英文标题】:Spring @Transactional with different Isolation levels from different call sources 【发布时间】:2014-04-02 10:48:47 【问题描述】:我想在 DAO 中使用相同的功能,假设 getBalances()
与安全 SERIALIZABLE
隔离:
@Transactional(isolation=Isolation.SERIALIZABLE)
public List<Balance> getBalances() ...
在重要的业务逻辑方法中:
public doVeryImportantFinancialChanges()
.. complicated logic with multiple getEntries() calls, multiple SELECT/UPDATE...
但我也希望有不安全“生命视图”,每 1-2 秒调用一次,仅使用 SELECT
和可接受的损坏完整性以及所有那些不可重复、幻像等数据。
问题是我的“生活观”预定SELECT
请求者使用getBalances()
高度隔离的功能,并得到:
org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback; SQL [SELECT * FROM ....]; Deadlock found when trying to get lock; try restarting transaction;
如何实现从不同调用源对同一方法 getBalances() 的双重(安全序列化和不安全)访问?
【问题讨论】:
服务应该是事务边界,而不是你的 dao。将具有正确配置的@Transactional
移动到所需的服务方法。
【参考方案1】:
尝试在getBalances
上使用@Transactional(propagation = Propagation.MANDATORY)
并在调用服务上定义隔离。
【讨论】:
以上是关于Spring @Transactional 具有来自不同调用源的不同隔离级别的主要内容,如果未能解决你的问题,请参考以下文章
具有@async超时值的Spring @transactional不起作用
Spring @Transactional 对服务和非服务方法的不同行为?