1、事物 訪問或修改數據庫內容的程序的執行稱爲事物
①事物的特性 如上圖
②事物的模式
顯式事物(主要):用戶使用T-SQL明確定義開始和結束的事物
begin/commit/rollback transation
自動提交事物:sql默認事物方式,能夠制動執行並且能夠自動回滾的事物
對數據庫進行刪除或修改等操作時,如果出現錯誤,操作將被自動取消
隱式事物:當事物提交或回滾後,自動開始的事物
/*--------------------------------------------事 務----------------------------------------------------*/
/*--轉帳測試:張三轉賬1000元給李四--*/
--我們可能會這樣這樣編寫語句
--張三的帳戶少1000元,李四的帳戶多1000元
UPDATE bank SET currentMoney = currentMoney - 1000 WHERE customerName = '張三'
UPDATE bank SET currentMoney = currentMoney + 1000 WHERE customerName = '李四'
GO
--再次查看轉帳後的結果。
SELECT * FROM bank
GO
/*--使用事務進行解決--*/
--開始一個事務
BEGIN TRANSACTION tran_bank --也可簡寫爲begin tran tran_bank
--定義一個用於記錄錯誤的變量
DECLARE @tran_error INT
SET @tran_error = 0
--在張三的賬戶減去
UPDATE bank SET currentMoney = currentMoney - 10000 WHERE customerName = '張三'
SET @tran_error = @tran_error + @@error
--在李四的賬戶增加
UPDATE bank SET currentMoney = currentMoney + 10000 WHERE customerName = '李四'
SET @tran_error = @tran_error + @@error
IF @tran_error = 0
BEGIN
--沒有發現錯誤,提交事務
COMMIT TRANSACTION
PRINT '交易成功,已保存新數據'
END
ELSE
BEGIN
--執行出錯,回滾事務
ROLLBACK TRANSACTION
PRINT '轉賬失賬,交易已取消'
END
GO
--再次查看轉帳後的結果。
SELECT * FROM bank
GO
--事務的基本結構
--1、開啓事務
--2、定義變量,用於保存錯誤編號
--3、對每一條sql語句進行錯誤捕捉
--4、對錯誤編號進行處理
-- 4.1成功,提交事務
-- 4.2失敗,回滾事務
2、遊標 遊標是一種數據對象,使用它可以按行而不是按集合操縱數據
遊標的幾個語名: declare聲明遊標
open打開遊標
clase關閉遊標
deallocate釋放遊標
fetch可用於在遊標中讀取記錄行
/*--------------------------------------------遊 標----------------------------------------------------*/
/*--語法結構--*/
--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
/*---------------------------------遊標------------------------------------------*/
--聲明遊標
declare cur
cursor scroll
for select customerName,currentMoney
from bank
--打開遊標
open cur
--讀取遊標
--定義變量,用於存放遊標讀取出來的值
declare @name varchar(6),@money money
--讀取遊標第一條記錄行,並存放在變量中
fetch first from cur into @name,@money
--循環讀取遊標中的記錄
while @@FETCH_STATUS=0
begin
--用print輸出讀取的數據
print @name+'的餘額爲'+convert(varchar(10),@money)
--讀取下一條記錄
fetch next from cur into @name,@money
end
--關閉遊標
close cur
--釋放遊標
deallocate cur