張勝
摘要:數(shù)據(jù)庫中的事務(wù)處理是數(shù)據(jù)庫教學(xué)的重點內(nèi)容,該文結(jié)合SQL Server數(shù)據(jù)庫對 其特性,執(zhí)行,編寫規(guī)則等做了概括論述,并結(jié)合教學(xué)實踐,對相關(guān)注意事項做了簡要說明,這對于如何學(xué)好該知識點具備一定指導(dǎo)意義。
關(guān)鍵詞:SQL SERVER; 事務(wù); 鎖
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2014)30-7017-02
事務(wù)的作用是保證一系列的數(shù)據(jù)操作可以全部正確完成,不會造成數(shù)據(jù)操作到中途未完成而導(dǎo)致數(shù)據(jù)完整性出錯,鎖的作用是保證數(shù)據(jù)在操作過程中不會受到任何其他影響,事務(wù)和鎖都是數(shù)據(jù)庫中的重要功能,這里將結(jié)合SQL SERVER數(shù)據(jù)庫談?wù)勈聞?wù)處理部分內(nèi)容。
1 事務(wù)的特性
事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列工作有下列四個屬性:
原子性:事務(wù)必須是原子性的工作單元,對事務(wù)里的操作,要么全都執(zhí)行,要么全不執(zhí)行。
一致性:事務(wù)完成時,必須使所有數(shù)據(jù)都保持一致狀態(tài),所有規(guī)則都必須應(yīng)用于事務(wù)的修改。
隔離性:由并發(fā)事務(wù)所做的修改必須與其他并發(fā)事務(wù)所做的修改隔離,事務(wù)在開始時就會識別數(shù)據(jù)所處的狀態(tài),以便發(fā)生錯誤時回滾操作,所以另一個并發(fā)事務(wù)要么修改它之前的狀態(tài),要么修改他之后的狀態(tài),不能在該事物正在運行時去修改他的狀態(tài)。
持久性:在事務(wù)完成后,其操作結(jié)果對于系統(tǒng)的影響應(yīng)該是永久的。
2 執(zhí)行事務(wù)的注意事項
1) 在每個操作之后,都要檢查@@ERROR和@@ROWCOUNT的值。
因為@@ERROR只對當(dāng)前操作有小,當(dāng)進行第二個操作時,@@ERROR的值就會被第二個操作的值取代。@@ROWCOUNT的作用是判斷該操作影響了多少條記錄,當(dāng)使用UPDATE或DELETE進行更新或刪除操作時,若沒有符合條件的記錄,那么其所影響的記錄數(shù)為0,但并不出錯,所以@@ERROR的值也為0.因此,還要檢查@@ROWCOUNT的值,以確定操作是否成功。
2) 當(dāng)一個事務(wù)結(jié)束后,緊跟在事務(wù)之后的代碼還可以繼續(xù)執(zhí)行,但出錯后不能再回滾事務(wù)了。
3) 已經(jīng)提交完畢的事務(wù)會將數(shù)據(jù)寫入數(shù)據(jù)庫,此時也不能回滾事務(wù)。
4) 在每個事務(wù)正在執(zhí)行時,若發(fā)生斷電等意外,則在下次重啟系統(tǒng)后,該事務(wù)會自動回滾。
5) 無法回滾的語句不能在事務(wù)中使用,如:create database、alter database等。
3 事務(wù)的工作原理
事務(wù)在開始時,SQL SERVER就會將要修改的數(shù)據(jù)鎖定,同時創(chuàng)建一個臨時事務(wù)日志,在該日志里存放要更改的數(shù)據(jù)和更改的過程。事務(wù)未提交時,事務(wù)中所有數(shù)據(jù)操作是臨時的,一旦發(fā)生數(shù)據(jù)操作失敗,就是用臨時日志去回滾事務(wù)操作,并解除鎖定。在事務(wù)被成功提交后,數(shù)據(jù)庫九江臨時事務(wù)日志的內(nèi)容存儲到數(shù)據(jù)庫中,此時事務(wù)操作完成。
4 事務(wù)執(zhí)行的模式
顯式事務(wù):明確定義事務(wù)開始和結(jié)束的事務(wù)。
自動提交事務(wù):這是SQL SERVER DATABASE ENGINE的默認事務(wù)方式,每一個T-SQL語句都可以看成一個自動提交事務(wù)。
隱式事務(wù):當(dāng)執(zhí)行“SET IMPLICIT_TRANSACTIONS ON”語句后,SQL SERVER將會進入隱式事務(wù)模式,系統(tǒng)將在提交或回滾當(dāng)前事務(wù)后自動啟動新的事物,不需要再次定義事務(wù)的開始,隱式事務(wù)產(chǎn)生的是一個連續(xù)的事務(wù)序列。
5 編寫事務(wù)的規(guī)則
1) 事務(wù)要盡可能簡短
事務(wù)在啟動后,DBMS會在事務(wù)結(jié)束前保留很多資源,以保證事務(wù)的ACID性質(zhì),若在事務(wù)里還要修改數(shù)據(jù),數(shù)據(jù)管理系統(tǒng)還會使用鎖來保護修改過的行,其他事務(wù)此時不能對這些行進行控制,直至事務(wù)結(jié)束,在多用戶系統(tǒng)里,這種過大資源的占有和過長時間的鎖定,是不可忍受的。
2) 在事務(wù)中訪問的數(shù)據(jù)量要盡量少。
這也是基于事務(wù)會對數(shù)據(jù)加鎖的理由。
3) 在事務(wù)處理期間盡量不要請求用戶輸入
在事務(wù)處理過程中,如果還要等待用戶輸入,事務(wù)占用的所有資源都會保留相當(dāng)長時間,會造成阻塞。
6 事務(wù)的隔離級別
事務(wù)具有隔離性,在同一時間可以有多個事務(wù)處理數(shù)據(jù),但每個數(shù)據(jù)在同一時刻只能有一個事務(wù)操作,將數(shù)據(jù)鎖定可以防止其他事務(wù)影響當(dāng)前事務(wù)操作的數(shù)據(jù),但會影響數(shù)據(jù)庫使用效率。甚至造成死鎖。事務(wù)隔離級別是用來設(shè)置事務(wù)在讀取數(shù)據(jù)時的隔離狀態(tài),從而提高數(shù)據(jù)并發(fā)使用效率的一種手段,SQL SERVER中事務(wù)隔離級別由低到高可分為5個級別。
Read Uncommitted:不隔離數(shù)據(jù),即使在事務(wù)正在使用數(shù)據(jù)的同時,其他事務(wù)也能同時修改或刪除該數(shù)據(jù)。Read Committed:不允許讀取沒有提交的數(shù)據(jù),這是SQL SERVER的默認隔離級別,由于事務(wù)還沒有提交,數(shù)據(jù)被修改的可能性還很大。REPEATABLE READ:在事務(wù)中鎖定所讀取的數(shù)據(jù)不讓其他程序修改或刪除,如此可以保證在事務(wù)中每次讀取到的數(shù)據(jù)都一致,其他事務(wù)可以在該數(shù)據(jù)表中新增數(shù)據(jù)。Snapshot:快照隔離,可以為讀取數(shù)據(jù)的事務(wù)提供所需數(shù)據(jù)的一個已提交版本,因此寫入數(shù)據(jù)的事務(wù)不會阻塞讀取數(shù)據(jù)的事務(wù)。Serializable:將事務(wù)所要用到的數(shù)據(jù)表全部鎖定。
7 小結(jié)
本文總結(jié)了在SQL SERVER中事務(wù)處理的基本原理和使用注意事項,對于使用SQL SERVER進行數(shù)據(jù)庫教學(xué)的教師具有一定的參考價值。
參考文獻:
[1] 朱如龍. SQL Server2005數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)技術(shù)[M].北京:機械工業(yè)出版社,2006.
[2] 尹志宇. 數(shù)據(jù)庫原理與應(yīng)用教程[M]. 北京:清華大學(xué)出版社,2013.
[3] Ramez Eimasri. 數(shù)據(jù)庫系統(tǒng)基礎(chǔ)[M]. 北京:人民郵電出版社, 2009.endprint