事务回滚 事务回滚( Transaction rollback)是指当事务中的 某一语句执行失败时,将对数据库的操作恢复到事 务执行前或某个指定位置。 事务回滚使用 ROLLBACK TRANSACTION命令 其语法如下 ROLLBACK ITRANSACTIONI transaction name @tran name variable I savepoint name @savepoint variable] I 其中 savepoint name和 savepoint variable参数 用于指定回滚到某一指定位置。 如果要让事务回滚到指定位置,则需要在事务中 设定保存点 Save point
11 事务回滚 • 事务回滚(Transaction Rollback) 是指当事务中的 某一语句执行失败时,将对数据库的操作恢复到事 务执行前或某个指定位置。 • 事务回滚使用ROLLBACK TRANSACTION 命令, 其语法如下 • ROLLBACK [TRAN[SACTION] [transaction_name | @tran_name_variable • | savepoint_name | @savepoint_variable] ] • 其中savepoint_name 和@savepoint_variable 参数 用于指定回滚到某一指定位置。 • 如果要让事务回滚到指定位置,则需要在事务中 设定保存点Save Point
·所谓保存点是指定其所在位置之前的事务语句 不能回滚的语句,即此语句前面的操作被视为 有效。 其语法如下: SAVE TRANISACTION savepoint name I @savepoint variable] 各参数说明如下: avepoint name:指定保存点的名称。同事务 的名称一样,只有前32个字符会被系统识别。 @savepoint variable:用变量来指定保存点的 名称变量,只能声明为CHAR、 VARCHAR、 NCHAR或 NVARCHAR类型 12
12 • 所谓保存点是指定其所在位置之前的事务语句 不能回滚的语句,即此语句前面的操作被视为 有效。 • 其语法如下: • SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable} • 各参数说明如下: • avepoint_name:指定保存点的名称。同事务 的名称一样,只有前32 个字符会被系统识别。 • @savepoint_variable:用变量来指定保存点的 名称变量,只能声明为CHAR、VARCHAR、 NCHAR 或NVARCHAR 类型
例:删除后勤部再将后勤部的职工划归到经理室 begin transaction my transaction delete use sample go delete from department where dept id=71012 save transaction after delete update employee set dept id=,1001 where dept id=’1012 if aaerrorl=0 or acrowcount=0 then begin rollback tran after delete/回滚到保存息 after delete 如果使用 rollback my transaction delete则会回滚到事务 开始前* print‘更新员工信息表时产生错误 commit transaction my transaction delete go 13
13 • 例: 删除后勤部再将后勤部的职工划归到经理室 • begin transaction my_transaction_delete • use sample • go • delete from department where dept_id = ’1012’ • save transaction after_delete • update employee set dept_id = ’1001’ where dept_id = ’1012’ • if @@error!=0 or @@rowcount=0 then • begin • rollback tran after_delete /* 回滚到保存点after_delete • 如果使用rollback my_transaction_delete 则会回滚到事务 开始前 */ • print ‘更新员工信息表时产生错误’ • commit transaction my_transaction_delete • go
事务工作机制 例如: begin tran Insert tablel values(1,’abc’) Update table l set coll=5 where coll=l Delete from tablel where coll=5 Commit tran
14 事务工作机制 • 例如:begin tran • Insert table1 values(1,’abc’) • Update table1 set col1=5 where col1=1 • Delete from table1 where col1=5 • Commit tran
1、当 begin tran语句到达数据库时, sql server分 析出这是事务的开始, SQLServer找到下一个可用 的内存日志页面,并给新事务分配一个事务D。 2、接着运行插入语句,新的行被记录到事务日志 中,数据页面在内存中进行修改,若所需页面不 在内存中,则从磁盘调出。 3、 updatet语句以类似方式运行。 4、当 sql server收到 commit tran时,日志页面被 写道数据库的日志设备上,这样才能保证日志页 面可被恢复。由于日志变化写入了硬盘,它保证 事务是可恢复的,即使掉电了或在数据页写入磁 盘时数据库崩溃了,也能进行事务恢复 15
15 • 1、当begin tran语句到达数据库时,sql server分 析出这是事务的开始,SQL server找到下一个可用 的内存日志页面,并给新事务分配一个事务ID。 • 2、接着运行插入语句,新的行被记录到事务日志 中,数据页面在内存中进行修改,若所需页面不 在内存中,则从磁盘调出。 • 3、update语句以类似方式运行。 • 4、当sql server 收到commint tran时,日志页面被 写道数据库的日志设备上,这样才能保证日志页 面可被恢复。由于日志变化写入了硬盘,它保证 事务是可恢复的,即使掉电了或在数据页写入磁 盘时数据库崩溃了,也能进行事务恢复