【问题标题】:Is it ever unsafe to commit an SQL Connection object?提交 SQL Connection 对象是否不安全?
【发布时间】:2016-04-06 22:31:15
【问题描述】:

我收到错误:

SQL State:  25001
Error Code: 20000
Message:    Cannot close a connection while a transaction is still active.

我理解这一点,因为当事务未提交或回滚时,我正在关闭数据库连接。

这应该很容易解决。但是,我使用的是连接池。所以我真的不确定这个连接在哪里未提交。我只是想优雅地关闭连接池中的每个连接。

在关闭事务之前总是调用 commit 是否安全?

if (!connection.isClosed())
{
    connection.commit();
    connection.close();
}

解决此问题的另一种方法是仔细检查每个数据库操作以确保已提交连接。这是一条安全的捷径吗?

【问题讨论】:

  • 定义安全吗? DELETE FROM USERS; commit;
  • @Elliott Frisch 我假设所有操作都是有意的。但是,可能存在导致提交永远不会发生的异常。我不是 100% 为什么提交从未发生过。
  • 我会更自在地盲目回滚,而不是盲目地提交。
  • 你回滚上次数据库更新是什么。例如,添加用户。
  • 它抛出了一个异常;所以大概没有正常工作

标签: java sql database connection database-connection


【解决方案1】:

记录并回滚。

永远不要盲目地提交。

连接池应该回滚任何与活动事务一起返回的连接。这里的想法是,在返回连接时事务仍然处于活动状态的原因是借用线程存在某种问题并且没有正常完成其进程。

【讨论】:

  • 我没有机会回滚一个有用的事务吗?
  • 从不。如果它是一个有用的事务,那么它就会被提交。根据定义,任何省略提交的业务逻辑都至少有一个错误(错误处理事务边界),因此完全值得怀疑,因为它没有经过适当的测试/验证。如果您回滚,您将保护数据库的完整性并更快地发现错误。如果您提交,您将在数据库中获得错误数据并隐藏潜在的错误。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2011-01-28
  • 2017-02-17
  • 2010-09-21
相关资源
最近更新 更多