我在 Spring MVC 框架中有一个带有 @Transactional 注释的服务,它调用两个不同的 DAO,使用不同的 JdbcTemplate 和不同的数据源:
为了在整个服务中使用相同的事务,我们为两个数据源配置了 ChainedTransactionManager。
Service调用两个Daos,一个使用JDBCTemplate1在一张表中创建一行,另一个Dao使用JDBCTemplate2在另一个表中创建一行,使用JDBCTemplate1添加的行的PK作为FK。
似乎 MySQL 正在锁定第一个数据源表中的行,直到提交为止,并且在第二个数据源中尝试将其分配为 FK 时无法访问它,从而产生锁定等待超时。这是没有意义的,因为两者都在同一个事务中。
自行交易它工作正常。如果我在第一个数据源的表中创建行,并在第二个数据源的表中创建行(但不分配PK),如果提交,两者都在整个事务中提交,如果整个事务回滚,则两者都回滚.
似乎由于某种原因事务无法解锁在第一个数据源中创建的行以供第二个数据源使用。
知道发生了什么吗?我认为这个问题与 MySQL 的 @Transactional 行为有关,但我不知道如何解决。
谢谢!
答案 0 :(得分:0)
你能删除 FK 参考并检查吗?