李煥玲
摘要:該文介紹了SQL Server數(shù)據(jù)庫中事務(wù)的概念及分類,以及事務(wù)處理的必要性。并舉例探討了在SQL Server數(shù)據(jù)庫中如何使用事務(wù),介紹了在Java中利用JDBC進行事務(wù)處理的方法。
關(guān)鍵詞:數(shù)據(jù)庫;事務(wù)處理;數(shù)據(jù)一致性
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)18-0023-02
隨著計算機技術(shù)的飛速發(fā)展,數(shù)據(jù)庫技術(shù)在實際生活中得到了廣泛的應(yīng)用,在使用過程中也從單個用戶向網(wǎng)絡(luò)用戶發(fā)展,這也使得數(shù)據(jù)庫在安全性管理上顯得更為迫切。在數(shù)據(jù)庫操作過程中,有時要執(zhí)行的一個SQL語句塊中,可能為會出現(xiàn)一條或幾條語句因意外故障而被中斷執(zhí)行,這樣就有要能產(chǎn)生數(shù)據(jù)庫中的數(shù)據(jù)不一致,解決這個問題的方法就是數(shù)據(jù)庫的事務(wù)。
1事務(wù)概述
數(shù)據(jù)庫中的事務(wù)是一組T-SQL語句組成的集合,這組語句必須作為一個整體來執(zhí)行,要么成功執(zhí)行每一條語句,要么一條語句發(fā)生意外未被執(zhí)行,則所有操作復(fù)原,數(shù)據(jù)庫恢復(fù)到語句執(zhí)行之前的狀態(tài)。例如,銀行的轉(zhuǎn)賬業(yè)務(wù),將A賬戶向B賬戶轉(zhuǎn)入1000元錢,要完成轉(zhuǎn)賬業(yè)務(wù),首先將A賬戶中的余額減少1000元,再將B賬戶余額增加1000元,這兩個操作均成功后才能完成轉(zhuǎn)賬業(yè)務(wù),否則,數(shù)據(jù)恢復(fù),取消轉(zhuǎn)賬,這就是一個事務(wù)。
1.1事務(wù)特性
事務(wù)作為單個邏輯工作單元,它具有4個特性:
原子性(Atomicity):事務(wù)是一個完整的操作。事務(wù)的各步操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行;
一致性(Consistency):當事務(wù)完成或失敗時,數(shù)據(jù)必須處于一致狀態(tài);
隔離性(Isolation):對數(shù)據(jù)進行的事務(wù)操作是彼此隔離的,這表明事務(wù)必須是獨立的,它不應(yīng)以任何方式依賴于或影響其他事務(wù);
永久性(Durability):事務(wù)完成后,它對數(shù)據(jù)庫的修改被永久保持,事務(wù)日志能夠保持事務(wù)的永久性。
1.2事務(wù)類型
sql server數(shù)據(jù)庫中的事務(wù)分為三類:顯式事務(wù)、隱式事務(wù)和自動提交事務(wù)。
顯示事務(wù):用begin tran指定事務(wù)的開始,以committran或rollback tran語句結(jié)束。這是最常用的事務(wù)類型。
隱性事務(wù):通過設(shè)置set implicit transactions on語句,將隱性事務(wù)模式設(shè)置為打開,下一個語句自動啟動一個新事務(wù)。當該事務(wù)完成時,再下一個T-SQL語句又將啟動一個新事務(wù)。
自動提交事務(wù):這是SQL Server的默認模式,它將每條單獨的T-SQL語句視為一個事務(wù),如果成功執(zhí)行,則自動提交,如果錯誤,則自動回滾。
2 sql server中的事務(wù)處理
sql server中的事務(wù)以BEGIN TRANSACTION指定事務(wù)的開始,以commit tran或rollback tran語句結(jié)束。假如,A賬戶中有100元,B賬戶中有100元,現(xiàn)在將A賬戶的1000元轉(zhuǎn)入B賬戶,代碼如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb+1000 where username=′B′
commit tran
因為A賬戶的余額不足,執(zhí)行時會出現(xiàn)一個違反check約束的錯誤信息,但隨后又提示“1行受影響”。我們執(zhí)行select*from account后發(fā)現(xiàn)A賬戶中的余額不足,所以第一行update語句沒有執(zhí)行,但B賬戶中卻增加了1000元錢。這是什么原因呢?原來SQL Server在發(fā)生runtime錯誤時,默認會rollback引起錯誤的語句,而繼續(xù)執(zhí)行后續(xù)語句。這顯示是不合理的,我們應(yīng)避免這種情況發(fā)生。
2.1利用set xactabort on
在事務(wù)處理的最前面加上set xact_abort on語句,當xact_abort選項為on時,SQL Server在遇到錯誤時會終止執(zhí)行并rollback整個事務(wù)。代碼如下:
set xact_abort on
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb+1000 where username=′B′
commit tran
此時,會發(fā)現(xiàn)當A中余額不足時,轉(zhuǎn)賬失敗,B賬戶中的余額也沒有增加。
2.2判斷每條SQL語句
在每個單獨的DML語句執(zhí)行后,立即判斷執(zhí)行狀態(tài),并做相應(yīng)處理。利用@@ERROR的值進行判斷SQL語句是否成功執(zhí)行,若@@ERROR的值大于0,SQL語句失敗,則回滾事務(wù)并恢復(fù)數(shù)據(jù)庫。代碼如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
if@@error>0
rollback tran
update account set rmb=rmb+1000 where username=′B′
if@@error>0
rollback tran
commit tran
2.3利用try…catch異常處理機制
在SQL Server中,可利用try…catch異常處理機制來處理事務(wù),代碼如下:endprint
begin tran
begintry
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb+1000 where username=′B′
endtry
begin catch
if@@error>0
rollback tran
end catch
if@@trancount>0
commit tran
3 java中的事務(wù)
在Java中使用JDBC建立與數(shù)據(jù)庫的連接,執(zhí)行SQL語句并處理執(zhí)行結(jié)果。那么,在JDBC中怎樣將多個SQL語句組合成一個事務(wù)呢?在JDBC中,建立一個數(shù)據(jù)庫連接對象Connec-tion時,事務(wù)處理默認是auto-commit模式,這時每個SQL語句都被當做一個事務(wù),即每次執(zhí)行一個語句,都會自動的提交該事務(wù)。為了能將多個SQL語句組合成一個事務(wù),要將auto-commit模式屏蔽。在auto-commit模式屏蔽之后,只有調(diào)用commit()方法,SQL語句才會提交事務(wù),若要撤銷事務(wù),則利用rollback()方法。例如,將A賬戶轉(zhuǎn)入B賬戶1000元,其中COBB為Connection對象,以下代碼來實現(xiàn)該事務(wù)處理:
public void editBank0{
conn.setAutoCommit(false);∥關(guān)閉自動提交
String sqll="update account set rmb=rmb-1000 where user-name=′A′":
String sql2="update account set rmb=rmb+1000 where user-name=′B′";
tty{
Stement st=conn.createStatement();∥創(chuàng)建stmemem對象
conn.setAutoCommit(false);∥關(guān)閉自動提交模式
st.executeUpdate(sql1);
st.executeUpdate(sql2);
conn.commit();∥提交事務(wù)
System.out.println("轉(zhuǎn)賬成功");
}catch(Exception e){
try{
conn.rollback();∥回滾事務(wù)
System.out.println("轉(zhuǎn)賬失敗");
}catch(SQLException e1){
eL.printStackTrace();}
∥e.printStackTrace();}}
當兩條SQL語句執(zhí)行成功時,調(diào)用commit()方法提交事務(wù),轉(zhuǎn)賬成功,否則調(diào)用rollback()方法回滾事務(wù),轉(zhuǎn)賬失敗,數(shù)據(jù)庫恢復(fù)到未轉(zhuǎn)賬之前的狀態(tài),從而保證數(shù)據(jù)的一致性。
4總結(jié)
綜上所述,事務(wù)是數(shù)據(jù)庫中的核心概念,只有科學(xué)合理地使用事務(wù)處理,才能提高信息系統(tǒng)的運行效率,保證數(shù)據(jù)一致性和完整性問題,從而確保數(shù)據(jù)的安全性。endprint