事务()
提交事务
COMMIT语句的功能是结束当前事务并使在事务期间对数据的所有修改永久保存在数据库中对于原生支持事务的所有RDBMS提交事务的语法实际上都是相同的这也是SQL的标准提交事务的语法非常简单
COMMIT [WORK]
尽管加上WORK这个关键字可以使语法更清晰但它并不是必需的一个简单的COMMIT语句就可以完成提交事务的工作
某些RDBMS在COMMIT语句中添加了大量的附加选项例如一个Oracleg/g语法的简单COMMIT语句如下所示
COMMIT [WORK] [COMMENT (<text>)[WRITE]] [FORCE (<text>) [<int>]] ;
可以使用COMMENT子句声明一个注释(最大长度为字节)用于记录每一个悬而未决的事务可以通过DBA_PC_PENDING目录视图来查看这些注释(关于系统目录请参考本章随后的内容)
IBM DB 中用于控制事务的语句在语法上遵循SQL标准在IBM的术语中事务就是一个工作单元(unit of workUOW)当对数据库发出SQL语句时总是隐式地启动一个事务发出语句时无需任何授权事务持有的全部锁随后都会被释放IBM DB 并不支持对事务命名
除了Microsoft SQL Server和PostgreSQL之外对于本书讨论的每一种数据库下面的语法都是有效的之所以可以使用COMMIT提交事务是因为对于这些RDBMS来说事务是隐式启动的
UPDATE books
SET bk_price =
WHERE bk_id=;
COMMIT;
只需COMMIT语句即可其他的选项都是可选的另外也可以使用COMMIT WORK语句该语法与COMMIT TRANSACTION的功能完全相同
数据库中的数据并不会发生任何改变直到最后的COMMIT语句执行因此就可以回滚事务在提交事务的问题上各个RDBMS之间存在着显着的差异例如在执行COMMIT命令时Microsoft SQL Server 必须已经隐式或显式地启动一个事务此时COMMIT才能够执行成功否则如果没有启动事务发出COMMIT命令就会产生一个错误
Server: Msg Level State Line
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
None of the other databases would complain no matter how many times you execute
COMMIT (though some like PostgreSQL might warn you that there are no pending
transactions to commit)
Microsoft SQL Server 使用了自己的语法来提交事务它不支持SQL标准的提交事务语法Microsoft的语法允许提交命名事务而SQL标准的语法不支持提交命名事务
COMMIT [ TRAN [ SACTION ] [<transaction name>]]
嵌套事务
对于嵌套事务来说命名的事务显得特别方便嵌套事务背后的思想就是在一个事务中又包含了另外一个事务而该内部事务可能又包含了一个内部的事务(在每一种RDBMS实现中对于事务可以嵌套多少级都有一定的限制)每一个子事务都知道更高一级的父事务在本书讨论的数据库中只有Microsoft SQL Server 和PostgreSQL这两种数据库对嵌套事务提供了内置的支持
只有显式事务才能进行嵌套在Microsoft SQL Server 中嵌套事务仅仅是为了提供代码的可读性提交一个内部事务并不会真正提交任何数据只有最外层的COMMIT语句才能向数据库实际提交修改所有其他内部的事务的提交操作仅仅是对事务计数器进行递减但是可以使用SAVEPOINT来回滚内部事务的修改
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程