Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果你不';是否不将事务提交到数据库(例如SQL Server)?_Sql Server_Transactions_Commit - Fatal编程技术网

Sql server 如果你不';是否不将事务提交到数据库(例如SQL Server)?

Sql server 如果你不';是否不将事务提交到数据库(例如SQL Server)?,sql-server,transactions,commit,Sql Server,Transactions,Commit,假设我有一个查询: begin tran -- some other sql code 然后我忘了承诺或回退 如果另一个客户端尝试执行查询,会发生什么情况?取决于输入事务的隔离级别 事务旨在完全运行或根本不运行。完成事务的唯一方法是提交,任何其他方法都将导致回滚 因此,如果您开始然后不提交,它将在连接关闭时回滚(因为事务被中断而没有标记为完成)。只要您不提交或回滚事务,它仍在“运行”并可能持有锁 如果您的客户端(应用程序或用户)在提交之前关闭了与数据库的连接,则任何仍在运行的事务都将回滚并终止

假设我有一个查询:

begin tran
-- some other sql code
然后我忘了承诺或回退


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

取决于输入事务的隔离级别


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


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

只要您不提交或回滚事务,它仍在“运行”并可能持有锁


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

当您打开事务时,任何事务都不会自行锁定。但是,如果您在该事务中执行某些查询,则根据隔离级别,某些行、表或页会被锁定,因此会影响尝试从其他事务访问这些行、表或页的其他查询。

您可以亲自尝试,这将有助于您了解其工作原理

在ManagementStudio中打开两个窗口(选项卡),每个窗口都有自己的sql连接

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

使用不同的隔离级别和无锁提示来查看它们如何影响结果

还可以查看在事务中抛出错误时发生的情况

理解所有这些东西是如何工作的是非常重要的,否则很多时候,您将被sql所做的事情难倒


玩得开心!GJ.

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


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

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

如果“自动提交”模式被禁用,并且您关闭连接时未显式提交或回滚上次更改,则会执行隐式提交操作

Hsqldb进行回滚

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

2011-11-14 14:20:22519主信息[SqlAutoCommitExample:55][AutoCommit enabled=false] 2011-11-14 14:20:22546主要信息[SqlAutoCommitExample:65][在数据库中找到0个用户]


交易示例

开始训练

您的sql语句

如果发生错误 回滚传输 其他的 提交传输


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

任何未提交的事务都会使服务器锁定,其他查询也不会在服务器上执行。您需要回滚事务或提交它。关闭SSM还将终止允许执行其他查询的事务

事务的行为不依赖于隔离级别。它们可能导致的锁的数量确实如此。我很确定连接能够读取哪些数据肯定取决于隔离级别。如果将隔离设置为“读取未提交”,则可以读取尚未提交的数据,并且实际上可能会在轨迹的某个点回滚,但这确保没有锁定。如果已将提交读取为隔离级别,则无法读取未提交的行-第二个客户端将挂起,除非使用SNAPSHOT.mmm,好的,我发现这是在创建某种锁。我不确定关闭连接是否真的能让我脱离这种状态。问题是我在尝试提交时出错。现在我关闭了连接,一切正常。旁注:如果使用ManagementStudio,关闭查询窗口将关闭connection@BradleyDotNET:是的,请务必记住,默认情况下,如果关闭查询窗口/连接,SQL Server Management Studio将自动提交。每个人都应注意“可能持有锁”这是回答的一部分。这可能适用于Oracle(我不知道),但提问者询问的是MS SQL。第一句话适用于JDBC驱动程序,而不是服务器。请注意,命名事务不仅在MS SQL中是不必要的,而且会给人一种错误的控制感<代码>开始传输X。。。开始训练。。。例如,回滚Y不起作用。请参阅“确定”,但是否至少在发出提交之前将事务写入日志?例如,假设我想启动一个事务,在执行commit之前运行insert命令并“执行其他操作”。我的insert命令是否会写入日志?这样,如果服务器在执行commit之前崩溃,它可以返回到原来的位置,我可以稍后发布commit(只要我完成了“其他操作”)。@user1870400显然,这个用户给出的答案是。。。试试看,应该是这样的,但情况并非总是如此……比如mySQL的MyISAM,它当然不支持事务。