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 。例如:
use test
go

/*啓動一個事務向student表中插入一個記錄*/
begin transaction
insert into student  values(100,'陳浩','男',19)
commit tran

select * from student   
go

回滾事務: ROLLBACK TRANSACTION 。例如:
/*啓動一個事務向student表中刪除一個記錄,然後回滾該事務*/
begin transaction
delete student  where sno=100
rollback

select * from student    --由於回滾該事務,因此student表中沒有插入記錄。
go

在事務內設置保存點: SAVE TRANSACTION 。保存點是如果有條件的取消事務的一部分,事務可以返回的位置。例如:
/*在事務內設置保存點*/
begin transaction mytran         --啓動事務
select * from student
save transaction s1      --設置保存點。
insert into student values(200,'王洪','男',22)   --插入另一個學生的記錄
rollback transaction s1   --事務回滾到保存點s1
commit transaction
go 
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語句時,都會自動啓動一個事務,而不需要使用 BEGINTRANSACTION 語句。
啓動新事務的Transact-SQL語句包括:
 
 
 
在發出COMMITROLLBACK語句之前,該事務一直保持有效。在第一個事務被提交或回滾之後,下次當連接執行這些語句的任何語句時,SQL Server都將自動啓動一個新事務。
 
隱性事務模式可以通過使用SET語句來打開或者關閉,其語法格式爲: SET IMPLICIT_TRANSACTIONS { ON | OFF } 
 
隱性事務模式打開時,用戶必須在該事務結束時顯式提交或回滾。
 
隱性事務模式將保持有效,直到執行   SET IMPLICIT_TRANSACTIONS OFF 語句使連接返回到自動提交模式。
 
例如:
/*演示在將IMPLICIT_TRANSACTIONS設置爲ON時顯式或隱式啓動事務。
使用@@trancount函數返回當前連接的活動事務數。 */
set nocount on
print cast(@@trancount as char(5))
create table table1(a int)
insert table1 values(1)
go 
print cast(@@trancount as char(5))

print '使用顯式事務'
begin tran
insert table1 values(2)
print '當前連接的活動事務數:'+cast(@@trancount as char(5))
commit tran

print '當前連接的活動事務數:'+cast(@@trancount as char(5))
go 

print '設置 implicit_transactions爲on'
set implicit_transactions on
go 
print '使用隱式事務'
insert into table1 values(4)  --這裏不需要begin tran語句來定義事務的啓動
print '當前連接的活動事務數:'+ cast(@@trancount as char(5))
commit tran
print '當前連接的活動事務數:'+ cast(@@trancount as char(5))
go

drop table table1
set implicit_transactions off

/*BEGIN TRANSACTION 語句使 @@TRANCOUNT 遞增 1。
ROLLBACK TRANSACTION 將 @@TRANCOUNT 遞減爲 0,
但 ROLLBACK TRANSACTION savepoint_name 語句並不影響 
@@TRANCOUNT 值。COMMIT TRANSACTION 將 @@TRANCOUNT 遞減 1。*/

分佈式事務
 
跨越兩個或多個服務器上的數據庫的事務就是分佈式事務。
與本地事務的不同在於事務的提交(2pc)
控制分佈式事務的T-SQL語句包括: begin distributed transaction 、 commit transaction\commit work 、 rollback transaction\rollbackwork 

 

 

數據的鎖定

 

併發問題包括:修改丟失髒讀不可重複讀幻讀
事務的隔離級別:未提交讀提交讀可重複讀可串行讀
 
SQL SERVER 2005中的鎖: 共享鎖 排它鎖更新鎖意向鎖架構鎖
 
封鎖技術需要解決的問題:死鎖
 
 
鎖的若干自定義操作:

1.通過Set lock_timeout 設置事務被阻塞的最長時間;通過@@lock_timeout查看。例如:

/*查看@@lock_timeout*/
print @@lock_timeout     --LOCKTIMEOUT 的缺省值是 -1,這意味着將沒有鎖超時

set lock_timeout 1800
print @@lock_timeout

2. 定義事務隔離級別(4種) set transaction isolation level ... 

 

3. 鎖定提示。例如:

/*在select,insert,update和delete等語句中使用表級鎖定提示*/
set transaction isolation level serializable
begin tran
    select * from student with(tablock)
    exec sp_lock
commit tran

select object_name(1013578649)

博客園博客:欠扁的小籃子

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章