在我的java应用程序中,我正在运行 Transaction I ,其中插入在表A 上完成。
事务I 还调用一个方法,该方法使用单独的连接来创建单独的 Transaction II ,以便在表B中创建记录 。 (此表用于跟踪内部ID生成,重要的是,无论 Transaction I 发生什么, Transaction II 都会被提交。
现在,由于事情的原因,表B 实际上引用了表A 的PK(这实际上是问题)。
但是,由于 A 中的记录只是在&#34;外部&#34; 交易I ,尚未提交,因此在 B (指向 A )中作为参考插入的值因此不存在于< em>交易II 。 (换句话说,我怀疑这个值对于事务II是不可见的,因为它没有被提交)
现在在这种情况下,我希望得到一个FK约束违规错误,但我得到了
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:超出锁定等待超时;尝试重新启动交易。
在postgresql数据库上测试相同的场景会提高预期:
org.postgresql.util.PSQLException:错误:在表格上插入或更新&#34; B &#34;违反外键约束
我怀疑mysql数据库知道第一个事务的插入并且实际上试图在第二个事务中等待第一个事务完成以实际能够插入第二个事务的记录吗?
当然,由于第一笔交易也等待第二笔交易完成,因此无法发生。所以&#34;内部&#34;事务在超时时中止。
两个数据库系统的行为有什么不同,还是我错过了什么?
更新:我认为这与mysql(REPEATABLE_READ)和postgresql(READ_COMMITED)的不同默认隔离级别有关
答案 0 :(得分:0)
您不能拥有两个单独的连接,并希望它能够正常工作。 您应该编写一个代码,您可以将当前连接对象传递给方法,以便在该方法中重新使用连接,而不会抱怨fk。
答案 1 :(得分:0)
我的具体问题的解决方案是简单地删除表B 和表A 之间的FK约束,因为无论如何都不需要它。
MySQL和PostgreSQL之间的不同行为肯定源于有关隔离级别的默认设置。