sql server 事務處理


事物處理
 
事務是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語句包括:
 
 
 
在發出COMMITROLLBACK語句之前,該事務一直保持有效。在第一個事務被提交或回滾之后,下次當連接執行這些語句的任何語句時,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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM