假设我有一个查询:
begin tran
-- some other sql code
然后我忘了提交或回滚。
如果另一个客户端尝试执行查询,会发生什么?
答案 0 :(得分:123)
只要你没有 COMMIT 或 ROLLBACK 一个交易,它仍然在“正在运行”并可能持有锁。
如果您的客户端(应用程序或用户)关闭数据库的连接,任何仍在运行的事务将被回滚并终止。
答案 1 :(得分:33)
你可以自己尝试一下,这可以帮助你了解它是如何工作的。
在管理工作室中打开两个窗口(标签),每个窗口都有自己的连接到sql。
现在你可以在一个窗口中开始一个事务,做一些像插入/更新/删除但尚未提交的东西。然后在另一个窗口中,您可以看到数据库在事务外部的外观。根据隔离级别,表可能会被锁定,直到第一个窗口被提交,或者您可能(不)看到其他事务到目前为止所执行的操作等等。
使用不同的隔离级别并且没有锁定提示来查看它们如何影响结果。
另请参阅在事务中抛出错误时会发生什么。
了解所有这些东西是如何工作的非常重要,或者你会被sql所做的事情困扰,很多时候。
玩得开心! GJ。
答案 2 :(得分:13)
交易旨在完全或根本不运行。完成事务的唯一方法是提交,任何其他方式都将导致回滚。
因此,如果您开始然后不提交,它将在连接关闭时回滚(因为事务被中断而没有标记为完整)。
答案 3 :(得分:3)
取决于传入事务的隔离级别。
答案 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#用户]