《數據庫》課件第8章-事務的概念及創建_第1頁
《數據庫》課件第8章-事務的概念及創建_第2頁
《數據庫》課件第8章-事務的概念及創建_第3頁
《數據庫》課件第8章-事務的概念及創建_第4頁
《數據庫》課件第8章-事務的概念及創建_第5頁
已閱讀5頁,還剩12頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1回顧帶有輸出參數的存儲過程存儲過程調用存儲過程2思考:寫一個存儲過程執行銀行轉賬的功能,假設數據庫中有賬戶表Account(UserName,UserAccount),現要將用戶A轉賬到用戶B一定的金額,完成存儲過程。createprocprcTransfer@OriginUservarchar(20),@DesUservarchar(20),@MoneymoneyAs…

if(selectUserAccountfromAccount whereUserName=@OriginUser)>=@Money

begin updateAccountsetUserAccount=UserAccount-@Money whereUserName=@OriginUser updateAccountSetUserAccount=UserAccount+@Money whereUserName=@DesUser

end...假設程序執行到第一個更新語句時斷電了?3第七章

事務的概念及創建4目標事務的概念創建包含事務的存儲過程保存部分事務58.1事務的概念及應用

SQLServer提供了一種叫做事務的機制,它可以保證指定的對數據庫的一系列操作作為一個整體被執行,在最終提交操作之間,用戶可以隨時取消前面的操作,將數據庫還原到沒有執行操作前的狀態,或者操作全部完成,將所有的操作提交到數據庫。6事務的屬性

原子性:事務必須是原子工作單元。它對數據庫所進行的操作,要么全都執行,要么全都不執行。

一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用于事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(B數索引)都必須是正確的。

隔離性:由并發事務所作的修改必須與任何其他并發事務所作的修改隔離。事務查看數據時數據所處的狀態,要么是另一并發事務修改它之前的狀態,要么是另一事務修改它之后的狀態,事務不會查看中間狀態的數據。

持久性:事務完成之后,它對于系統的影響是永久性的。該修改即使出現系統故障也將一直保持。78.2事務的操作啟動事務:

BEGINTRANSACTION[事務名]回滾事務:

ROLLBACKTRANSACTION[事務名]提交事務:

COMMITTRANSACTION[事務名]注意,不能在發出COMMITTRANSACTION語句之后回滾事務,因為數據修改已經成為數據庫的永久部分。8示例:定義一個事務,向“學生”表中插入兩條記錄。其中,第1條INSERT語句是正確的,而第2條INSERT語句是錯誤的。執行此事務語句后,查看“學生”表中的數據,確認第1條語句沒有被執行。

解決方案:createprocprcInsertStudentasbegintrybegintransactionINSERTINTOStudentVALUES('A00010',‘Andy',21,'男','Nanjing',90,1)INSERTINTOStudentVALUES(‘A00011’,‘mary’,21,'女','Nanjing',150,1)committransactionendtrybegincatch print'出錯了'endcatch思考:編譯器執行到第二個insert語句時,會如何處理?Rollbacktransaction98.3包含事務的存儲過程結構CREATEPROC存儲過程名@參數名參數類型[,…n]ASBEGINTRY IFEXISTS() BEGIN BEGINTRANSACTION //執行事務語句 COMMITTRANSACTION END ELSE //信息不存在ENDTRYBEGINCATCH ROLLBACKTRANSACTIONENDCATCH10習題創建事務,假設給定學號的學生將從原系轉入給定的系,則相應的系總人數將發生變化,如果兩系相差人數小于10,則允許該生轉系,否則回滾事務。假設系表Department(DepID,DepName,Total)解決方案:①求出給定學號對應的原系號②求出給定轉入的系名對應的系號③更新學生表中該學號對應的新系號④將系表中原系號對應的總人數-1⑤將系表中轉入的系號對應的總人數+1⑥獲取原系號對應的人數⑦獲取新系號對應的人數⑧如果人數相差<=10,則提交事務;否則回滾事務。11程序createprocprcTransfer@StuIDchar(10),@DepNamevarchar(40)As…IFEXISTS(SELECT*FROMStudentWHEREStuID=@StuID)IFEXISTS(SELECT*FROMDepartmentWHEREDepName=@DepName)begin

begintran

declare@OrginalDepint,@NewDepint

select@OrginalDep=DepIDfromstudentwhereStuID=@StuID

select@NewDep=DepIDfromdepartmentwhereDepName=@DepName

updatestudentsetDepID=@NewDepwhereStuID=@StuID

updateDepartmentsetTotal=Total+1whereDepName=@DepName

updateDepartmentsetTotal=Total-1whereDepID=@OrginalDep

declare@OrginalTotalint,

@NewTotalint

select@OrginalTotal=TotalfromdepartmentwhereDepID=@OrginalDep

select@NewTotal=TotalfromdepartmentwhereDepID=@NewDep

if(@OrginalTotal-@NewTotal>=-10and@OrginalTotal-@NewTotal<=10)

committran

else

rollbacktran

end…12回滾事務的一部分SC表和Department表需要用下面的事務來更新:操作1:UPDATESCSETScore=Score+1WHEREStuID=‘A00001’andCourseID=1UPDATESCSETScore=Score-1WHEREStuID=‘A00001’andCourseID=

2操作2:INSERTINTOSTUDENTVALUES('A00014','mary',21,'男','Nanjing',90,2)UPDATEDepartmentSETTotal=Total+1WHEREDepID=213思考所有更新應一起來做。對于Department,如果Total值大于100,由第二個事務所產生的改變必須被回滾,而由第一個事務產生的改變是允許的。148.4設置事務保存點在事務內設置保存點。保存點把事務分成幾個邏輯單元,如果事務的一部分是有條件地被取消,這樣事務可以返回到保存點。語法:SAVETRAN[SACTION]{savepoint_name}15解決方案BEGINTRANSACTION

UPDATESCSETScore=Score+1WHEREStuID=‘A00001’andCourseID=1UPDATESCSETScore=Score-1WHEREStuID=‘A00001’andCourseID=

2SAVETRANSACTIONtrnTransaction1INSERTINTOSTUDENTVALUES('A00014','mary',21,'男','Nanjing',90,2)UPDATEDepartmentSETTotal=Total

溫馨提示

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

評論

0/150

提交評論