第五章 事務和遊標
什麼是事務?
1.在資料庫的實際應用中,有時候要把包含有多個步驟的指令當作一個整體來執行。這個整體要麼全部執行成功,要麼全部執行失敗,這就需要考慮事務。
2.事務(TRANSACTION)是由若干條T_SQL指令組成的作為單個邏輯工作單元執行的一系列操作,這些操作作為一個整體一起向系統提交,全部執行完成,要麼全部撤銷。
3.事務是一個不可分割的工作邏輯單元。
事務的特性
1.原子性(Atomicity):事務是一個完整的操作,各步操作是不可分的(原子的);要麼都執行,要麼都不執行,不存在只完成一部分的情況。
2.一致性(Consistency):當事務完成時,資料必須處於一致狀態;在事務開始之前及完成之後,資料儲存中的資料處於一致狀態,處理期間可以不一致。
3.隔離性(Isolation):對資料進行修改的所有併發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務。
4永久性(Durability):事務完成後,它對資料庫的修改被永久保持,事務日誌能夠保持事務的永久性,即使出現系統故障也將一直保持。
事務的模式
一:顯示事務
1.使用者使用T-SQL明確定義開始和結束的事務
2.begin/commit/rollback/transaction
二:自動提交事務
1.sql server預設事務方式,能夠自動執行並能自動回滾的事務
2.對資料進行刪除/修改等操作時,出現錯誤,操作將會被自動取消
三:隱式事務
1.當事務提交或回滾後,自動開始的事務
遊標
有些應用程式,不需要對查詢得到的整個記錄集進行訪問,而只需要其中的一行或者少量的幾行資料,或者希望對其進行處理時,就需要考慮遊標
遊標實際上是一中能從包括多條資料記錄的結果集中每次提取一條記錄的機制
使用遊標,可以實現以下目標:
1.允許定位到結果集的特定行
2.從結果集的當前位置檢索一行或多行資料
3.支援對結果集中當前位置的行進行修改
SQL Server支援的遊標
一:T_SQL的遊標
1.基於declare cursor語法,主要用於T_SQL指令碼,儲存過程和觸發器中
2.在伺服器上實現,由客戶端發往伺服器的T-SQL指令進行管理
二 :API遊標
1.基於應用程式介面,在伺服器上實現
三:客戶端遊標
1.通過在客戶端快取記憶體所有結果集行來實現
遊標的基本操作
1:
2:
3:
語法結構 --DECLARE cursor_name --遊標名 --CURSOR [LOCAL | GLOBAL] --全域性或區域性的 --[FORWARD ONLY | SCROLL] --遊標滾動方式 --[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC] --遊標讀取方式 --FOR SELECT_statements --查詢語句 --[FOR UPDATE [OF Column_name[,….N]]] --可更改欄位
操作步驟如下:
/*--使用遊標--*/ --1.宣告遊標 DECLARE bank_cursor CURSOR SCROLL FOR SELECT * FROM bank --FOR SELECT customerName,currentMoney FROM bank --獲取部分列
--2.開啟該遊標 OPEN bank_cursor
--3.讀取遊標 --定義個變數,用於存放遊標中讀取出來的值 DEClARE @id int DECLARE @name CHAR(10) DECLARE @money MONEY --讀取遊標的第一條記錄行,並存放在變數中 FETCH FIRST FROM bank_cursor INTO @id,@name,@money --IF (@@fetch_status = 0) --BEGIN -- PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --END --FETCH NEXT FROM bank_cursor INTO @id,@name,@money --IF (@@fetch_status = 0) --BEGIN -- PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --END --迴圈讀取遊標中的記錄 PRINT '讀取的資料如下:' WHILE (@@fetch_status = 0) BEGIN --用print輸出讀取的資料 PRINT '賬戶名:' + @name + ' 餘額:' + convert(VARCHAR,@money) --update bank set currentMoney = currentMoney+1000 where customerId = @id --讀取下一條記錄行 FETCH NEXT FROM bank_cursor INTO @id,@name,@money END
--4.讀取完成後關閉遊標 CLOSE bank_cursor
--5.釋放遊標 DEALLOCATE bank_cursor