Answers:
只要您不提交或回滚事务,它仍在“运行”并可能持有锁。
如果您的客户端(应用程序或用户)在提交之前关闭了与数据库的连接,则所有仍在运行的事务将被回滚并终止。
您实际上可以自己尝试一下,这应该有助于您了解它的工作原理。
在Management Studio中打开两个窗口(选项卡),每个窗口都有自己的sql连接。
现在,您可以在一个窗口中开始事务,执行诸如插入/更新/删除之类的操作,但尚未提交。然后在另一个窗口中,您可以从事务外部查看数据库的外观。根据隔离级别,表可能会被锁定,直到提交第一个窗口为止,或者您可能(尚未)看到到目前为止其他事务已完成的工作,等等。
尝试使用不同的隔离级别,并且没有锁定提示,以查看它们如何影响结果。
另请参阅在事务中引发错误时会发生什么。
了解所有这些东西的工作方式非常重要,否则很多时候您会被sql所困扰。
玩得开心!GJ。
取决于传入事务的隔离级别。
交易示例
开始转换tt
您的sql语句
如果发生错误,则回滚tran tt否则提交tran tt
只要您尚未执行commit tran tt,数据就不会更改
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
例如,它不起作用。见stackoverflow.com/questions/1273376/...
该行为未定义,因此您必须显式设置提交或回滚:
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 = false] 2011-11-14 14:20:22,546主要信息[SqlAutoCommitExample:65] [在数据库中找到0#用户]