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 使用

Spring @Transactional 对服务和非服务方法的不同行为?

为hibernate和@Transactional配置spring数据源

Spring 事务注解@Transactional

Spring @Transactional 只读传播