Spring @Transactional具有来自不同呼叫源的不同隔离级别

时间:2014-04-02 10:48:48

标签: java sql spring transactions deadlock

我想在DAO中使用相同的函数,假设getBalances()具有安全SERIALIZABLE隔离:

@Transactional(isolation=Isolation.SERIALIZABLE)
public List<Balance> getBalances() { ... }

重要的商业逻辑方法:

public doVeryImportantFinancialChanges() {
.. complicated logic with multiple getEntries() calls, multiple SELECT/UPDATE...
}

但我也希望不安全&#34;生活视图&#34;每1-2秒调用一次余额,只有SELECT和可接受的破坏完整性以及所有那些不可重复的幻像等数据。

问题在于我的生活观&#34;预定SELECT请求者使用getBalances()高度隔离的函数,并获取:

org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback; SQL [SELECT * FROM ....]; Deadlock found when trying to get lock; try restarting transaction;

如何从不同的来源实现对同一方法getBalances()的双重(安全可序列化和不安全)访问?

1 个答案:

答案 0 :(得分:2)

尝试在@Transactional(propagation = Propagation.MANDATORY)上使用getBalances并定义呼叫服务的隔离。