SQL Server 數據庫開發經典案例教程第11章數據庫事務_第1頁
SQL Server 數據庫開發經典案例教程第11章數據庫事務_第2頁
SQL Server 數據庫開發經典案例教程第11章數據庫事務_第3頁
SQL Server 數據庫開發經典案例教程第11章數據庫事務_第4頁
SQL Server 數據庫開發經典案例教程第11章數據庫事務_第5頁
已閱讀5頁,還剩16頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第11章數據庫事務本章目標理解事務的概念理解事務的特性、分類在SQLServer中啟動、提交和回滾事務掌握事務的隔離級別為什么需要事務事務能確保把對多個數據操作作為一個單元來處理例如:銀行轉帳問題:假設張三的銀行卡有2000元,李四的卡有1000元,共計3000元。現在張三要轉1000元給李四,則要更新張三的帳戶,減少余額1000元,更新李四帳戶余額,增加1000元。如果整個流程沒有出錯則最后張三余額1000元,李四2000元,共計3000元。數據和轉帳之前是一致的,假設在減少了張三的余額1000后,系統掉電或者出現意外李四的帳戶還沒完成更新。則最終的數據2000元,那怎么解決?事務的概念及特性事務提供了一種機制、是一個操作序列,它包含了一組數據庫操作命令,并且所有的命令作為一個整體一起向系統提交或撤消操作請求事務是作為單個邏輯工作單元執行的一系列操作事務的四個特性:原子性(Atomicity):事務能確保把對多個數據修改作為一個單元來處理,也就是原子操作。一致性(Consistency):當事務完成時,數據必須處于一致狀態隔離性(Isolation):對數據進行修改的所有并發事務是彼此隔離的。這表明事務必須是獨立的,它不應以任何方式依賴或影響其他事務持久性(Durability):當事務完成之后,它對于系統的影響是永久性的。事務的分類事務分類顯式事務隱性事務自動提交事務顯式事務:顯式事務是顯式地定義其開始和結束的事務

BEGINTRANSACTION…數據庫操作如:插入記錄

…數據庫操作如:刪除記錄COMMITTRANSACTION事務的分類隱性事務:通過Transact-SQL的SETIMPLICIT_TRANSACTIONSON語句,將隱性事務模式設置為打開。

SETIMPLICIT_TRANSACTIONSONGO/*第一次執行Insert語句的時候將自動啟動一個隱性事務*/INSERTINTOImpTranVALUES(1,'aaa')INSERTINTOImpTranVALUES(2,'bbb')GO/*提交第一個事務*/COMMITTRANSACTIONGO/*執行SELECT語句將啟動第二個隱性事務*/SELECTCOUNT(*)FROMImpTranGOINSERTINTOImpTranVALUES(3,'ccc')GOSELECT*FROMImpTranGO/*提交第二個事務*/COMMITTRANSACTIONGOSETIMPLICIT_TRANSACTIONSOFFGO事務的分類自動提交事務:所有Transact-SQL語句在完成時,都會提交或回滾。如果一條語句成功完成,則將其提交,如果遇到任何錯誤,則將其回滾;默認操作模式用T-SQL表示事務Transact-SQL使用下列語句來管理事務開始事務:BEGINTRANSACTION提交事務:COMMITTRANSACTION回滾(撤消)事務:ROLLBACKTRANSACTION下列變量在事務處理中非常有用。@@ERROR@@TRANCOUNT事務的應用示例:客戶購買圖書USEBookShopDbGO--一個客戶在銷售員編號為的用戶處購買了三種書,生成銷售記錄---SETNOCOUNTON--不顯示受影響的行數信息GOBEGINTRANSACTION--開始事務DECLARE@errINT--保存錯誤編號PRINT'客戶開始買書,事務開始'SET@err=0--插入銷售主表SalesMasterINSERTINTOSalesMasterVALUES(GETDATE(),'001')--聲明局部變量保存SalesMasterIDSET@err=@err+@@ERRORDECLARE@SalesMasterIDINT--獲取最新的SalesMasterIDSELECT@SalesMasterID=@@IDENTITY--購買三本書INSERTINTOSalesDetails

VALUES(@SalesMasterID,'B0001',1,0.9,45)SET@err=@err+@@ERRORINSERTINTOSalesDetails

VALUES(@SalesMasterID,'B0003',1,1,118)SET@err=@err+@@ERRORINSERTINTOSalesDetails

VALUES(@SalesMasterID,'B0004',2,0.8,28)SET@err=@err+@@ERROR--購買完成,根據錯誤編號決定是否執行成功IF@err=0BEGINPRINT'購買成功,事務結束'COMMITTRANSACTIONENDELSEBEGINROLLBACKTRANSACTIONPRINT'購買失敗,事務回滾'ENDGO事務的隔離級別事務的隔離級別是指一個事務必須和其他事務在進行資源或者數據更改時相隔離的程度較低的隔離級別可以增強許多用戶同時訪問數據的能力,但也增加了用戶可能遇到的并發副作用(例如臟讀或丟失更新)的數量。相反,較高的隔離級別減少了用戶可能遇到的并發副作用的類型,但需要更多的系統資源,并增加了一個事務阻塞其他事務的可能性SQLServer支持的隔離級別READUNCOMMITTED未提交讀(隔離事務的最低級別)READCOMMITTED已提交讀(數據庫引擎的默認級別)REPEATABLEREAD可重復讀SERIALIZABLE可序列化(隔離事務的最高級別,事務之間完全隔離)未提交讀--第一個事務USEBookShopDbGOSETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;GOBEGINTRANSACTIONGOSELECT*FROMpublisherWHEREPublisherID=1GOUPDATEPublisherSETPublisherName=PublisherName+'2'WHEREPublisherID=1GOSELECT*FROMpublisherWHEREPublisherID=1GOWAITFORDELAY'00:00:15'GOROLLBACKTRANSACTION;GOSELECT*FROMpublisherWHEREPublisherID=1GO--第二個事務USEBookShopDbGOSETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED;GOBEGINTRANSACTIONGOSELECT*FROMpublisherWHEREPublisherID=1GOCOMMIT;GO可重復讀--第一個事務USEBookShopDbGOSETTRANSACTIONISOLATIONLEVELREPEATABLEREAD;GOBEGINTRANSACTIONGOSELECT*FROMpublisherWHEREPublisherID=1GOWAITFORDELAY'00:00:15'GOSELECT*FROMpublisherWHEREPublisherID=1GOCOMMITTRANSACTION;GO---第二個事務USEBookShopDbGOSETTRANSACTIONISOLATIONLEVELREPEATABLEREAD;GOBEGINTRANSACTIONGOSELECT*FROMpublisherWHEREPublisherID=1GOUPDATEPublisherSETPublisherName=PublisherName+'2'WHEREPublisherID=1GOSELECT*FROMpublisherWHEREPublisherID=1GOCOMMITTRANSACTION;SELECT*FROMpublisherWHEREPublisherID=1GO數據庫死鎖在數據庫的并發應用中,多個請求同時向數據庫發送請求,如果各個進程均占有不會釋放的資源,但因互相申請被其他進程所站用不會釋放的資源而處于的一種永久等待狀態。這種狀態就是常說的死鎖死鎖示例USEBookShopDbGOBEGINTRANSACTIONUPDATEPublisherSETPublisherName=PublisherName+'publisher'WHEREPublisherID=1WAITFORDELAY'00:00:20'SELECT*FROMcategoryROLLBACKTRANSACTION等待20秒之后顯示查詢結果:--第二個查詢USEBookShopDbGOBEGINTRANSACTIONUPDATEPublisherSETPublisherName=PublisherName+'publisher'WHEREPublisherID=1WAITFORDELAY'00:00:20'SELECT*FROMcategoryROLLBACKTRANSACTION等待20秒之后顯示查詢結果:死鎖解決方法1.SQLServer自動選擇一條SQL語句作犧牲品,我們會發現兩個查詢中第一個正常執行,第二個則拋出錯誤。2.按照同一順序訪問資源:調換查詢二中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論