事务()
下面的例子演示了Microsoft SQL Server中嵌套事务的概念它使用内置的@@TRANCOUNT函数来跟蹤已初始化的事务的数量
BEGIN TRANSACTION trans
the transaction counter @@TRANCOUNT =
INSERT INTO <table> VALUES <values>
BEGIN TRANSACTION trans
the transaction counter @@TRANCOUNT =
INSERT INTO <table> VALUES <values>
BEGIN TRANSACTION trans
the transaction counter @@TRANCOUNT =
INSERT INTO <table> VALUES <values>
COMMIT TRANSACTION trans
Nothing committed at this point but the transaction
counter is decremented by ; @@TRANCOUNT =
COMMIT TRANSACTION trans
Nothing committed at this point but the transaction counter
is decremented by ; @@TRANCOUNT =
COMMIT TRANSACTION trans
All INSERTs are committed to the database
the transaction counter is decremented by ; @@TRANCOUNT =
在这个例子中为了将条记录插入到表中初始化了个事务只有最后一个COMMIT语句才会实际地将修改永久保存到表中
回滚事务
当需要取消对数据的修改时应该使用ROLLBACK回滚事务在最后的COMMIT语句之前都可以发出ROLLBACK命令ROLLBACK命令的结果是自动回滚自启动当前控制事务以来所做的全部修改
除了Microsoft SQL Server 中用户命名的事务和一些可选的子句之外在所有RDBMS中以及SQL标准中回滚事务的语法都是相同的下面的语句试图更新LIBRARY数据库的BOOKS表中的BK_PRICE列但是所有的修改都将被回滚
UPDATE book
SET bk_price =
WHERE bk_id=
ROLLBACK WORK
与COMMIT语句一样如果发出了ROLLBACK语句那么所有的锁都将被释放表列出了特定于各个厂商的ROLLBACK语句
表 各厂商特定的ROLLBACK语句
WORK子句是可选的TOSAVEPOINT子句将在本章随后进行解释FORCE子句附属于分布式事务它的行为非常类似于COMMIT语句中FORCE子句的功能Microsoft SQL Server则具有一个可选的<transaction name>子句
由于某些语句(例如DDL语句)在语句执行之前或执行之后自动地发出一条COMMIT语句因此在该DDL语句之前发生的对数据的修改也会被提交
保存点
通常情况下一个事务包含了一个以上的SQL语句你可能想COMMIT或ROLLBACK某些SQL语句为了增强事务处理的粒度引入了SAVEPOINT(保存点)的概念保存点允许在事务中定义一个命名的位置通常是查询中某些重要操作之后的里程碑如果在之后发生了错误可以回滚所有的修改但不是回滚到事务一开始而只是回滚到特定的保存点如果显式(或隐式就像在一个DDL语句之后)发出了一条COMMIT语句将释放在事务中声明的所有保存点
下面是一个在SQL批语句中使用SAVEPOINT的例子
UPDATE books
SET bk_price =
WHERE bk_id = ;
SAVEPOINT first_update;
DELETE books
WHERE bk_id = ;
SAVEPOINT first_delete;
DELETE books
WHERE bk_id = ;
ROLLBACK first_update;
COMMIT;
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程