26.1 什么是事务
事务是在数据库上按照一定的逻辑顺序执行的任务序列,既可以由用户手动进行,也可以由某种数据库程序自动执行。
事务实际上就是对数据库的一个或者多个更改。当你在某张表上创建更新或者删除记录的时候,你就已经在使用事务了。控制事务以保证数据完整性,并对数据库错误做出处理,对数据库来说非常重要。
实践中,通常会将很多SQL查询组合在一起,并将其作为某个事务一部分来执行。
26.2 事务的属性
事务具有以下四个标准属性,通常用缩略词ACID来表示:
原子性:保证任务中的所有操作都执行完毕;否则,事务会在出现错误时终止,并回滚之前所有操作到原始状态。
一致性:如果事务成功执行,则数据库的状态得到了进行了正确的转变。
隔离性:保证不同的事务相互独立、透明地执行。
持久性:及时出现系统故障,之前成功执行的事务的结果也会持久存在。
26.3 事务控制
有四个命令用于控制事务:
COMMIT:提交更改;
ROLLBACK:回滚更改;
SAVE:在事务内部创建一系列可以ROLLBACK的还原点;
SET TRANSAXTION:命名事务;
26.4 COMMIT命令
COMMIT命令用于保存事务对数据库所做的更改。
COMMIT命令会将自上次COMMIT命令或者ROLLBACK命令执行以来所有的事务都保存到数据库中。
COMMIT命令的语法如下所示:
COMMIT;
26.5 COMMIT事务实例
考虑Customers表
下面的示例将会删除表中姓名为“张三”的记录,然后将更改提交(COMMIT)到数据库中。
BEGIN TRANSACTION DELETE FROM customers_bak WHERE 姓名=‘张三‘ COMMIT;
上述语句将会从表中删除一行数据,再执行SELECT语句得到的结果没有张三的。
注意:SQL Server默认会自动提交事务,要取消自动提交事务可以执行如下操作:
在SSMS中的菜单栏中选择【工具】-【选项】-【查询执行】-【ANSI】,在界面右边勾选上SET IMPLICIT_TRANSACTIONS,设置完需重新启动SSMS方可生效。
26.6 ROLLBACK命令
ROLLBACK命令用于撤销尚未保存到数据库中的事务。
ROLLBACK命令只能撤销自上次COMMIT命令或者ROLLBACK命令执行以来的事务。
ROLLBACK命令的语法如下所示:
ROLLBACK;
26.7 ROLLBACK实例
考虑Customers表
下面的示例将会从表中删除城市为“广州”的记录,然后回滚(ROLLBACK)对数据库所做的更改:
BEGIN TRANSACTION DELETE FROM Customers WHERE 城市=‘广州‘ ROLLBACK;
结果是删除操作并不会对数据库产生影响。现在,执行SELECT语句将会得到结果。
26.8 SAVE命令
SAVE是事务中的一个状态点,使得我们可以将事务回滚至特定的点,而不是将整个事务都撤销。
SAVE命令的记录如下所示:
SAVE TRANSACTION SAVE_NAME;
该命令只能在事务语句之间创建保存点(SAVE)。ROLLBACK命令可以用于撤销一系列的事务。
回滚至某一保存点的语法如下所示:
ROLLBACK TRANSACTION SAVE_NAME;
下面的示例中,你计划从Customers表中删除三条不同的记录,并在每次删除之前创建一个保存点(SAVE),从而使得你可以在任何时候回滚到任意的保存点,以恢复数据至其原始状态。
注意:Oracle和MySQL的保存点语法与上述不同,语法为
SAVEPOINT SAVEPOINT_NAME;
26.9 SAVE示例
考虑Customers表
操作序列如下所示:
BEGIN TRANSACTION SAVE TRANSACTION SP1 DELETE FROM Customers WHERE 姓名=‘张三‘ SAVE TRANSACTION SP2 DELETE FROM Customers WHERE 姓名=‘李四‘ SAVE TRANSACTION SP3 DELETE FROM Customers WHERE 姓名=‘王五‘
现在,三次删除操作已经生效了,如果此时改变主意决定回滚至名字为SP2的保存点,由于SP2于第一次删除之后创建,所以后两次删除操作将会被撤销。
ROLLBACK TRANSACTION SP2 COMMIT;
注意:由于将数据库回滚至SP2,所以只有第一次删除真正起效了。
26.10 SET TRANSACTION命令
SET TRANSACTION命令可以用来初始化数据库事务,指定随后的事务的各种特征。
例如,可以将某个事务指定为只读或者读写。
SET TRANSACTION命令的语法如下所示:
SET TRANSACTION [READ WRITE| READ ONLY];
26.11 批注
事务在应用中很广泛,特别是针对一些读写问题时,使用事务可以很好的规避意外(脏读、幻读、不可重复读)。而且事务在出来误操作时也有很好的预防作用,特别是像SQL Server这种自动提交的数据库平台,使用事务能防止误删和误更新。
原文:https://www.cnblogs.com/yongzhao/p/14905430.html