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