症状
使用 XA 事务、 Microsoft SQL Server JDBC 驱动程序和 Microsoft SQL Server 作为后台数据库时,您可能会有孤立事务挂起在 SQL Server 上的如果事务管理器遇到故障或连接问题。
此外,您可能会遇到以下常见症状之一︰
-
交易记录处于挂起状态的 SQL Server 实例上很长时间。它们可能具有空值或-2会话 ID 在数据库中。
-
事务长时间阻止事务有-2会话 id。这会导致锁超时或冻结的线程。
原因
事务管理器和 SQL Server 之间的连接丢失时未准备好的交易记录,则 SQL Server JDBC 驱动程序不会不清理这些交易记录,并且他们可能会继续使用资源并阻止其他事务。由于 SQL Server 的 XA 实现 JDBC 驱动程序中,SQL Server 无法检测异常的事务管理器断开。因此,SQL Server 为这些交易记录保留系统中直到 XA 事务超时或重新启动数据库。超时的 SQL Server 实例上使用无穷,并且不可配置数据库上。
解决方法
若要解决此问题,请使用下列方法之一:
-
重新启动数据库服务器,当您遇到任何 Java 虚拟机 (JVM) 崩溃或网络连接问题,导致在这些孤立的事务。
-
分别以清理其资源的数据库上停止孤立的事务。若要验证事务孤立的请确保它不是在怀疑 (准备) 或一个目前完成事务。JVM 并成功恢复周期最后通过重新启动相关的任何事务应被孤立。
-
设置超过最长事务以使其停止超过超时值时,就立即对 XA 事务的超时值。您可以通过调用XAResource.setTransactionTimeout()方法来执行此操作。
-
对于许多第三方事务经理,由调用代码不直接访问XAResource对象和事务管理器不会设置事务超时值。在这种情况下,外部应用程序可用于将事务超时时间设置为新的默认值。此新的默认设置将适用于所有未指定事务超时的事务。