理解sql事故處理
1 在sql事務(wù)處理期間,由語句所完成的工作,在永久寫入數(shù)據(jù)庫之前都可以取消(使用rollback語句)。commit告訴dbms使數(shù)據(jù)庫的變化成為永久的。
下面就來理解一下事務(wù)處理過程
如:begin transaction
語句1
語句2
語句3
語句4
在應(yīng)用程序正常結(jié)束之前,4條修改語句并未提交,即未成為永久的,由此,異常結(jié)束將使得dbms取消由應(yīng)用程序體中的所有4條sql語句所做的修改。
如果想讓前兩條修改后永久保存到數(shù)據(jù)庫中,而不管后兩條是否成功。可以執(zhí)行如下事務(wù)。
如: begin transaction
語句1
語句2
commit transaction
begin transaction
語句3
語句4
2 在交互式會(huì)話期間,dbms默認(rèn)為自動(dòng)提交模式,這就意味著dbms自動(dòng)地提交(使之成為永久的)每一條成功執(zhí)行的sql語句的操作。因而,如果執(zhí)行以下語句
delete from employees
將不能使用 rollback transaction 使刪除的數(shù)據(jù)在恢復(fù)。
如何禁用自動(dòng)提交模式呢?ms_sql server允許通過執(zhí)行以下語句禁用自動(dòng)提交模式
begin transaction
3 對帶用大量語句時(shí),可以使用存儲(chǔ)點(diǎn)的方法,允許應(yīng)用程序取消所做工作并恢復(fù)到事務(wù)處理中的特定點(diǎn),由此,應(yīng)用程序可對存儲(chǔ)點(diǎn)使用rollback語句,重新做出事務(wù)處理中的部份語句所做的工作,而不必從頭開始
如:begin transaction
create table trans_table
(row_number smallint,descrp varchar(35))
insert into trans_table values(1,'insert 1')
insert into trans_table values(2,'insert 2')
//存儲(chǔ)點(diǎn)save1
save transaction save1
delete from trans_table where row_number = 2
insert into trans_table values(3,'insert 3')
insert into trans_table values(4,'insert 4')
//存儲(chǔ)點(diǎn)save2
save transaction save2
delete from trans_table where row_number = 1
delete from trans_table where row_number = 3
rollback transaction save2
update trans_table
set descrp = 'row 1 after 2'
delete trans_table where row_number = 4
commit transaction
在執(zhí)行上面語句后
執(zhí)行 select * from trans_table
的結(jié)果如下:
row_number descrp
1 'row 1 after 2'
3 'row 1 after 2'
新聞熱點(diǎn)
疑難解答
圖片精選