事物處理
事務是SQL Server中的單個邏輯單元,一個事務內的所有SQL語句作為一個整體執行,要么全部執行,要么都不執行。
事務有4個屬性,稱為ACID(原子性、一致性、隔離性和持久性)
原子性 事務必須是原子工作單元。對於其數據修改,要么全都執行,要么全都不執行。
一致性 事務在完成時,必須使所有的數據都保持一致狀態。
隔離性 由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。
持久性 事務完成之后,它對於系統的影響是永久性的。
事務分類
按事務的啟動和執行方式,可將事務分為3類:
1.顯示事務:顯式地定義啟動和結束的事務。
2.自動提交事務:自動提交模式是SQL Server的默認事務管理模式。每個Transact-SQL語句在完成時,都被提交或回滾。如果一個語句成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。
3.隱性事務:當連接以隱性事務模式進行操作時,SQL Server將在提交或回滾當前事務后自動啟動新事務。無須描述事務的開始,只須提交或回滾每個事務。隱性事務模式形成連續的事務鏈。
1.顯示事務
顯示事務需要顯示地定義事務的啟動和結束。
它是通過 BEGIN TRANSACTION 、 COMMIT TRANSACTION 、ROLLBACK TRANSACTION 、 SAVE TRANSACTION 等Transact-SQL語句來完成的。
啟動事務:
BEGIN TRANSACTION 。
結束事務: COMMIT TRANSACTION 。例如:
1 use test 2 go 3 4 /*啟動一個事務向student表中插入一個記錄*/ 5 begin transaction 6 insert into student values(100,'陳浩','男',19) 7 commit tran 8 9 select * from student 10 go
回滾事務:
ROLLBACK TRANSACTION
。例如:
1 /*啟動一個事務向student表中刪除一個記錄,然后回滾該事務*/ 2 begin transaction 3 delete student where sno=100 4 rollback 5 6 select * from student --由於回滾該事務,因此student表中沒有插入記錄。 7 go
在事務內設置保存點:
SAVE TRANSACTION 。
保存點是如果有條件的取消事務的一部分,事務可以返回的位置。例如:
1 /*在事務內設置保存點*/ 2 begin transaction mytran --啟動事務 3 select * from student 4 save transaction s1 --設置保存點。 5 insert into student values(200,'王洪','男',22) --插入另一個學生的記錄 6 rollback transaction s1 --事務回滾到保存點s1 7 commit transaction 8 go 9 select * from student --陳浩插入到表中而王洪沒有插入到表中
不能用於事務的操作:
操作 |
相應的SQL語句 |
創建數據庫 |
CREATE DATABASE |
修改數據庫 |
ALTER DATABASE |
刪除數據庫 |
DROP DATABASE |
恢復數據庫 |
RESTORE DATABASE |
加載數據庫 |
LOAD DATABASE |
備份日志文件 |
BACKUP LOG |
恢復日志文件 |
RESTORE LOG |
更新統計數據 |
UPDATE STATISTICS |
授權操作 |
GRANT |
復制事務日志 |
DUMP TRANSACTION |
磁盤初始化 |
DISK INIT |
更新使用sp_configure系統存儲過程更改的配置選項的當前配置值 |
RECONFIGURE |
2.自動提交事務
SQL Server沒有使用BEGIN TRANSACTION語句啟動顯式事務,或隱性事務模式未打開,將以自動提交模式進行操作。
當提交或回滾顯式事務或者關閉隱性事務模式時,SQL Server將返回到自動提交模式。
3.隱式事務
隱性事務模式設置為打開之后,當SQL Server首次執行某些Transact-SQL語句時,都會自動啟動一個事務,而不需要使用 BEGIN TRANSACTION 語句。
啟動新事務的Transact-SQL語句包括:

在發出COMMIT或ROLLBACK語句之前,該事務一直保持有效。在第一個事務被提交或回滾之后,下次當連接執行這些語句的任何語句時,SQL Server都將自動啟動一個新事務。
隱性事務模式可以通過使用SET語句來打開或者關閉,其語法格式為:
SET IMPLICIT_TRANSACTIONS { ON | OFF }
隱性事務模式打開時,用戶必須在該事務結束時顯式提交或回滾。
隱性事務模式將保持有效,直到執行 SET IMPLICIT_TRANSACTIONS OFF 語句使連接返回到自動提交模式。
例如:
1 /*演示在將IMPLICIT_TRANSACTIONS設置為ON時顯式或隱式啟動事務。 2 使用@@trancount函數返回當前連接的活動事務數。 */ 3 set nocount on 4 print cast(@@trancount as char(5)) 5 create table table1(a int) 6 insert table1 values(1) 7 go 8 print cast(@@trancount as char(5)) 9 10 print '使用顯式事務' 11 begin tran 12 insert table1 values(2) 13 print '當前連接的活動事務數:'+cast(@@trancount as char(5)) 14 commit tran 15 16 print '當前連接的活動事務數:'+cast(@@trancount as char(5)) 17 go 18 19 print '設置 implicit_transactions為on' 20 set implicit_transactions on 21 go 22 print '使用隱式事務' 23 insert into table1 values(4) --這里不需要begin tran語句來定義事務的啟動 24 print '當前連接的活動事務數:'+ cast(@@trancount as char(5)) 25 commit tran 26 print '當前連接的活動事務數:'+ cast(@@trancount as char(5)) 27 go 28 29 drop table table1 30 set implicit_transactions off 31 32 /*BEGIN TRANSACTION 語句使 @@TRANCOUNT 遞增 1。 33 ROLLBACK TRANSACTION 將 @@TRANCOUNT 遞減為 0, 34 但 ROLLBACK TRANSACTION savepoint_name 語句並不影響 35 @@TRANCOUNT 值。COMMIT TRANSACTION 將 @@TRANCOUNT 遞減 1。*/
分布式事務
跨越兩個或多個服務器上的數據庫的事務就是分布式事務。
與本地事務的不同在於事務的提交(2pc)
控制分布式事務的T-SQL語句包括: begin distributed transaction 、 commit transaction\commit work 、 rollback transaction\rollback work
數據的鎖定
並發問題包括:修改丟失;臟讀;不可重復讀;幻讀
事務的隔離級別:未提交讀;提交讀;可重復讀;可串行讀
SQL SERVER 2005中的鎖: 共享鎖; 排它鎖;更新鎖;意向鎖;架構鎖
封鎖技術需要解決的問題:死鎖
鎖的若干自定義操作:
1.通過Set lock_timeout 設置事務被阻塞的最長時間;通過@@lock_timeout查看。例如:
1 /*查看@@lock_timeout*/ 2 print @@lock_timeout --LOCKTIMEOUT 的缺省值是 -1,這意味着將沒有鎖超時 3 4 set lock_timeout 1800 5 print @@lock_timeout
2. 定義事務隔離級別(4種) set transaction isolation level ... 。
3. 鎖定提示。例如:
1 /*在select,insert,update和delete等語句中使用表級鎖定提示*/ 2 set transaction isolation level serializable 3 begin tran 4 select * from student with(tablock) 5 exec sp_lock 6 commit tran 7 8 select object_name(1013578649)