如果不在数据库中提交事务会发生什么情况(比如说SQL Server)

假设我有一个查询:

begin tran -- some other sql code 

然后我忘记提交或回滚。

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

只要你不COMMITROLLBACK一个交易,它仍然是“运行”,并可能持有锁。

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

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

在pipe理工作室打开两个窗口(标签),他们每个人都将有自己的连接到SQL。

现在你可以在一个窗口中开始一个事务,做一些插入/更新/删除,但还没有提交。 那么在另一个窗口中,您可以看到数据库从事务外看起来如何。 根据隔离级别的不同,表可能会被locking,直到第一个窗口被提交,或者您可能(不)看到其他事务到目前为止所做的事情等等。

玩弄不同的隔离级别,不要locking提示,看看它们如何影响结果。

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

了解所有这些东西的工作原理是非常重要的,否则很多时候你会被sql所干扰。

玩的开心! GJ。

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

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

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

Sql事务隔离解释

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

交易示例

开始转

你的sql语句

如果发生错误,则回滚通过其他方式提交

只要你没有执行commit,数据就不会被改变

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

您可以使用dbcc opentran查看最早的打开事务的详细信息。

任何未完成的事务将使服务器locking,其他查询将不会在服务器上执行。 您可能需要回滚事务或提交它。 closuresSSMS也将终止将允许其他查询执行的事务。

行为没有定义,所以你必须显式地设置一个提交或回滚:

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

“如果自动提交模式被禁用,并且在没有明确提交或回滚上次更改的情况下closures连接,则会执行隐式的COMMIT操作。

Hsqldb进行回滚

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

结果是

主要信息[SqlAutoCommitExample:65] [自动提交启用= false] 2011-11-14 14:20:22,546主要信息[