我正在开发一个基于Spring的Web服务和基于Spring Jdbc的持久性项目。 我已经配置了一个DataSourceTransactionManager来管理事务,并使用Pointcut将其应用于服务层。 事务传播级别设置为REQUIRED。
查询是通过Spring提供的JdbcTemplate发出的。
问题是,如果对服务发出多个并发请求,我会收到MySQLTransactionRollbackException(“尝试获取锁定时发现死锁;尝试重新启动事务”)。
显然其中一个交易获得了锁定,使第二个交易失败。
我的问题是 - 如何配置Spring以延迟服务的执行,直到可以获得锁定,而不是仅仅放弃并抛出异常?
我甚至无法捕获异常并尝试重新执行查询,因为我已将服务层上的事务应用为保持DAO清洁的建议。
我希望只获得声明性解决方案(因为我是AOP狂热者和反对样板代码的十字军:-))。但即使是程序化的解决方案也是受欢迎的。
感谢您的建议。
更新 -
@ninjalj是的,它确实是一个真正的僵局。结果我错误地写了我的测试用例。傻我: - (
答案 0 :(得分:0)
如果我没有弄错,那表示真正的死锁,所以你应该真的重试这个交易。 IIRC,等待锁定的超时在异常消息中有“超时”。