所謂事務(wù)是用戶定義的一個數(shù)據(jù)庫操作序列,這些操作要么全做要么全不做,是一個不可分割的工作單位。例如,在關(guān)系數(shù)據(jù)庫中,一個事務(wù)可以是一條SQL語句、一組SQL語句或整個程序。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供蘆山企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計、成都網(wǎng)站制作、HTML5建站、小程序制作等業(yè)務(wù)。10年已為蘆山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
簡單舉個例子就是你要同時修改數(shù)據(jù)庫中兩個不同表的時候,如果它們不是一個事務(wù)的話,當(dāng)?shù)谝粋€表修改完,可是第二表改修出現(xiàn)了異常而沒能修改的情況下,就只有第二個表回到未修改之前的狀態(tài),而第一個表已經(jīng)被修改完畢。
而當(dāng)你把它們設(shè)定為一個事務(wù)的時候,當(dāng)?shù)谝粋€表修改完,可是第二表改修出現(xiàn)了異常而沒能修改的情況下,第一個表和第二個表都要回到未修改的狀態(tài)!這就是所謂的事務(wù)回滾。
首先性能肯定受影響,因?yàn)橐聪蚧貪L操作。
以sqlserver為例,如果是插入操作,回滾期間鎖表,而且一般級別數(shù)據(jù)庫消耗時間接近1:3。如果插入進(jìn)行了1小時有可能要超過3小時多來完成回滾,此時不要強(qiáng)行關(guān)閉數(shù)據(jù)庫或者殺死進(jìn)程,也為無論如何為了保持acid特性也不會中止回滾只能等。
begin tran
。。。。。。
在存儲過程后面加上:
if @@error0
rollback tran
else
commit tran
sqlserver 的編輯器一般都是默認(rèn)自動提交,也就是說你刪除后,就自動提交了;不能回滾。
當(dāng)然如果你設(shè)置成不是默認(rèn)提交的話,那么你在提交之前可以回滾。
而如果是程序代碼中刪除的話,看你有沒有啟用事務(wù),如果沒有啟用事務(wù),那么一般也是默認(rèn)提交的,如果啟用事務(wù),那么再提交前可以回滾,如果已經(jīng)提交了,那么就回滾不了了。
放在事務(wù)里面就可以回滾哦!
sqlserver_update_事務(wù)回滾
begin?tran
update?
if?@@rowCount?!=約定數(shù)
goto?err
commit?tran
return;
err:
rollback?tran
return;
請參閱!
如何啟動Transaction; 共有三種方式
1.自動transaction
每句statement都是一個transaction.例一個update指令更新多筆紀(jì)錄, 要就全部成功, 只要失敗,全部會回復(fù)原值.
2.ExplicitTransaction
以Begin Transaction開始(開啟)
3.ImplicitTransaction (建議不要用)
以Set Implicit_Transaction ON
如何結(jié)束Transaction; 共有三種方式
1. COMMIT Transaction(提交)
Transaction期間的任何修改,都會保證到數(shù)據(jù)庫中
2. ROLLBACK Transaction(回滾)
數(shù)據(jù)會回復(fù)Transaction前狀態(tài)
3. KILL SPID 強(qiáng)迫停止, 會rollback