如何以声明方式处理事务并发?

时间:2012-03-31 10:33:03

标签: java mysql database spring transactions

我正在开发一个基于Spring的Web服务和基于Spring Jdbc的持久性项目。 我已经配置了一个DataSourceTransactionManager来管理事务,并使用Pointcut将其应用于服务层。 事务传播级别设置为REQUIRED。

查询是通过Spring提供的JdbcTemplate发出的。

问题是,如果对服务发出多个并发请求,我会收到MySQLTransactionRollbackException(“尝试获取锁定时发现死锁;尝试重新启动事务”)。

显然其中一个交易获得了锁定,使第二个交易失败。

我的问题是 - 如何配置Spring以延迟服务的执行,直到可以获得锁定,而不是仅仅放弃并抛出异常?

我甚至无法捕获异常并尝试重新执行查询,因为我已将服务层上的事务应用为保持DAO清洁的建议。

我希望只获得声明性解决方案(因为我是AOP狂热者和反对样板代码的十字军:-))。但即使是程序化的解决方案也是受欢迎的。

感谢您的建议。

更新 -

@ninjalj是的,它确实是一个真正的僵局。结果我错误地写了我的测试用例。傻我: - (

1 个答案:

答案 0 :(得分:0)

如果我没有弄错,那表示真正的死锁,所以你应该真的重试这个交易。 IIRC,等待锁定的超时在异常消息中有“超时”。