【发布时间】:2021-08-28 11:29:06
【问题描述】:
我在 Spring MVC 框架中有一个带有 @Transactional 注释的服务,它调用两个不同的 DAO,使用不同的 JdbcTemplate 和不同的数据源:
- JDBCTemplate1(链接到 Datasource1)
- JDBCTemplate2(链接到 Datasource2)
为了在服务中使用相同的事务,我们为两个数据源配置了 ChainedTransactionManager。
服务调用两个 Daos,一个使用 JDBCTemplate1 在一个表中创建一行,另一个 Dao 使用 JDBCTemplate2 在另一个表中创建一行,使用 JDBCTemplate1 添加的行的 PK 作为 FK。
似乎 MySQL 正在锁定第一个数据源的表中的行,直到提交,当我尝试在第二个数据源中将其分配为 FK 时,我无法访问它,从而产生锁定等待 tiemout。这没有任何意义,因为两者都在同一个事务中。
事务它自己工作正常。如果我在第一个数据源的表中创建行,并在第二个数据源的表中创建行(但没有分配 PK),如果提交,两者都在整个事务中提交,如果整个事务回滚,则两者都回滚.
似乎由于某种原因,Transaction 无法解锁在第一个数据源中创建的行以供第二个数据源使用。
有什么线索吗?我认为这个问题与 MySQL 有关,与 @Transactional 行为有关,但我不知道如何解决它。
谢谢!
【问题讨论】:
标签: java mysql spring-mvc jdbctemplate spring-transactions