如果您不将事务提交到数据库(例如,SQL Server)会发生什么?

时间:2011-02-04 09:36:43

标签: sql-server transactions commit

假设我有一个查询:

begin tran
-- some other sql code

然后我忘了提交或回滚。

如果另一个客户端尝试执行查询,会发生什么?

9 个答案:

答案 0 :(得分:123)

只要你没有 COMMIT ROLLBACK 一个交易,它仍然在“正在运行”并可能持有锁。

如果您的客户端(应用程序或用户)关闭数据库的连接,任何仍在运行的事务将被回滚并终止。

答案 1 :(得分:33)

你可以自己尝试一下,这可以帮助你了解它是如何工作的。

在管理工作室中打开两个窗口(标签),每个窗口都有自己的连接到sql。

现在你可以在一个窗口中开始一个事务,做一些像插入/更新/删除但尚未提交的东西。然后在另一个窗口中,您可以看到数据库在事务外部的外观。根据隔离级别,表可能会被锁定,直到第一个窗口被提交,或者您可能(不)看到其他事务到目前为止所执行的操作等等。

使用不同的隔离级别并且没有锁定提示来查看它们如何影响结果。

另请参阅在事务中抛出错误时会发生什么。

了解所有这些东西是如何工作的非常重要,或者你会被sql所做的事情困扰,很多时候。

玩得开心! GJ。

答案 2 :(得分:13)

交易旨在完全或根本不运行。完成事务的唯一方法是提交,任何其他方式都将导致回滚。

因此,如果您开始然后不提交,它将在连接关闭时回滚(因为事务被中断而没有标记为完整)。

答案 3 :(得分:3)

取决于传入事务的隔离级别。

Sql transaction isolation explained

答案 4 :(得分:2)

当您打开交易时,没有任何东西会被自己锁定。但是如果在该事务中执行某些查询,则根据隔离级别,某些行,表或页面会被锁定,因此会影响其他尝试从其他事务访问它们的查询。

答案 5 :(得分:1)

交易示例

开始转发

你的sql语句

如果发生错误     回滚过渡 其他     commit tran tt

只要您没有执行commit tran tt,数据就不会被更改

答案 6 :(得分:0)

除了您可能导致的潜在锁定问题之外,您还会发现事务日志开始增长,因为它们不能被截断超过活动事务的最小LSN,并且如果您使用快照隔离版本存储在tempdb中将因类似原因而增长。

您可以使用dbcc opentran查看最早开放交易的详细信息。

答案 7 :(得分:0)

任何未经注释的事务都会使服务器处于锁定状态,并且其他查询将无法在服务器上执行。您需要回滚事务或提交它。关闭SSMS也将终止事务,这将允许其他查询执行。

答案 8 :(得分:-4)

未定义行为,因此您必须显式设置提交或回滚:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

  

"如果禁用自动提交模式并关闭连接而未显式提交或回滚上次更改,则执行隐式COMMIT操作。"

Hsqldb进行回滚

con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" +  insertedUserId + "','Anton','Alaf')");
con.close();

结果是

  

2011-11-14 14:20:22,519主要信息[SqlAutoCommitExample:55] [AutoCommit enabled = false]   2011-11-14 14:20:22,546主要信息[SqlAutoCommitExample:65] [在数据库中找到0#用户]