sql 事務處理

事務定義:數據庫

事務是單個的工做單元。若是某一事務成功,則在該事務中進行的全部數據更改均會服務器

提交,成爲數據庫中的永久組成部分。若是事務遇到錯誤且必須取消或回滾,則全部session

數據更改均被清除。併發

事務三種運行模式:
自動提交事務
每條單獨的語句都是一個事務。
顯式事務
每一個事務均以 BEGIN TRANSACTION 語句顯式開始,
 COMMIT  ROLLBACK 語句顯式結束。
隱性事務
在前一個事務完成時新事務隱式啓動,但每一個事務仍以 COMMIT  ROLLBACK 語句異步

顯式完成。分佈式

事務操做的語法:函數

BEGIN TRANSACTION
BEGIN DISTRIBUTED TRANSACTION
COMMIT TRANSACTION
COMMIT WORK
ROLLBACK WORK
SAVE TRANSACTION
BEGIN TRANSACTION
工具

BEGIN TRANSACTION
標記一個顯式本地事務的起始點。spa

BEGIN TRANSACTION @@TRANCOUNT  1server

BEGIN TRANSACTION 表明一點,由鏈接引用的數據在該點是邏輯和物理上都一致的。若是趕上錯誤,在 BEGIN TRANSACTION 以後的全部數據改動都能進行回滾,以將數據返回到已知的一致狀態 。每一個事務繼續執行直到它無誤地完成而且用 COMMIT TRANSACTION 對數據庫做永久的改動,或者趕上錯誤而且用 ROLLBACK TRANSACTION 語句擦除全部改動

語法
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ]

例子:
BEGIN TRAN T1
UPDATE table1 ...
--nest transaction M2
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

BEGIN DISTRIBUTED TRANSACTION
指定一個由 Microsoft 分佈式事務處理協調器 (MS DTC) 管理的 Transact-SQL 分佈式事務的起始。

語法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]

參數
transaction_name
是用戶定義的事務名,用於跟蹤 MS DTC 實用工具中的分佈式事務。 transaction_name 必須符合標識符規則,可是僅使用頭 32 個字符

@tran_name_variable
是用戶定義的一個變量名,它含有一個事務名,該事務名用於跟蹤 MS DTC 實用工具中的分佈式事務。必須用 charvarcharnchar nvarchar 數據類型聲明該變量。

註釋
執行BEGIN DISTRIBUTED TRANSACTION 語句的服務器是事務建立人,而且控制事務的完成

當鏈接發出後續 COMMIT TRANSACTION  ROLLBACK TRANSACTION 語句時,
主控服務器請求 MS DTC 在所涉及的服務器間管理分佈式事務的完成。
有兩個方法可將遠程 SQL 服務器登記在一個分佈式事務中:

分佈式事務中已登記的鏈接執行一個遠程存儲過程調用,該調用引用一個遠程服務器。 
分佈式事務中已登記的鏈接執行一個分佈式查詢,該查詢引用一個遠程服務器。

示例
本例在本地和遠程數據庫上更新做者的姓。本地和遠程數據庫將同時提交或同時回滾本事務。

說明 
當前的SQL Server 上必須安裝 MS DTC.

USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE 
link_Server_T.pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO
Note:
若是須要鏈接遠程DB,若是是linkServer 方式鏈接的話,必定要修該linkServer RPC 選項置爲 True

SET XACT_ABORT
指定當 Transact-SQL 語句產生運行時錯誤時,Microsoft? SQL Server? 是否自動回滾當前事務。

能夠比較簡單的理解,若是中間有任何一句SQL 出錯,全部SQL所有回滾.特別適用於 Procedure 中間調用Procedure ,若是第一個Procedure Ok,被調用的Procedure 中間有錯誤,若是SET XACT_ABORT=false,則出錯的部分回滾,其餘部分提交,固然外部Procedure 也提交。).

---在分佈式Trans中必定要注意設置下面參數(XACT_ABORT)

語法SET XACT_ABORT { ON | OFF }

註釋  SET XACT_ABORT  ON 時,若是 Transact-SQL 語句產生運行時錯誤,整個事務將終止並回滾。爲 OFF 時,只回滾產生錯誤的Transact-SQL 語句,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。

對於大多數 OLE DB 提供程序(包括 SQL Server),隱性或顯式事務中的數據修改語句必須將 XACT_ABORT 設置爲 ON

SET XACT_ABORT 的設置是在執行或運行時設置,而不是在分析時設置。

示例 下例致使在含有其它 Transact-SQL 語句的事務中發生違反外鍵錯誤。在第一個語句集中產生錯誤,但其它語句均成功執行且事務成功
提交。在第二個語句集中,SET XACT_ABORT 設置爲 ON。這致使語句錯誤使批處理終止,並使事務回滾。

CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO

SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO

SAVE TRANSACTION
在事務內設置保存點。

語法 SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
參數 savepoint_name
是指派給保存點的名稱。保存點名稱必須符合標識符規則,但只使用前 32 個字符。
@savepoint_variable
是用戶定義的、含有有效保存點名稱的變量的名稱。
必須用 charvarcharnchar  nvarchar 數據類型聲明該變量。 註釋
用戶能夠在事務內設置保存點或標記。保存點定義若是有條件地取消事務的一部分,事 務能夠返回的位置。若是將事務回滾到保存點,則必須(若是須要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續完成事務,或者必須(經過將事務回滾到其起始點)徹底取消事務。若要取消整個事務,請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務的所 有語句和過程。

Note1 在由 BEGIN DISTRIBUTED TRANSACTION 顯式啓動或從本地事務升級而來的分佈式事務中,不支持 SAVE TRANSACTION

2當事務開始時,將一直控制事務中所使用的資源直到事務完成(也就是鎖定)。當將事務的一部分回滾到保存點時,將繼續控制資源直到事務完成(或者回滾所有事務)。

例子:begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
commit transaction

ROLLBACK TRANSACTION

將顯式事務或隱性事務回滾到事務的起點或事務內的某個保存點。
語法
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]

參數
transaction_name
是給 BEGIN TRANSACTION 上的事務指派的名稱。transaction_name 必須符合標識符規則,但只使用事務名稱的前 32 個字符。嵌套
事務時,transaction_name 必須是來自最遠的 BEGIN TRANSACTION 語句的名稱。
@tran_name_variable
是用戶定義的、含有有效事務名稱的變量的名稱。必須用 charvarcharnchar  nvarchar 數據類型聲明該變量。
savepoint_name
是來自 SAVE TRANSACTION 語句的 savepoint_namesavepoint_name 必須符合標識符規則。當條件回滾隻影響事務的一部分時使 savepoint_name
@savepoint_variable
是用戶定義的、含有有效保存點名稱的變量的名稱。必須用 charvarcharnchar  nvarchar 數據類型聲明該變量。

註釋 ROLLBACK TRANSACTION 清除自事務的起點或到某個保存點所作的全部數據修改。ROLLBACK 還釋放由事務控制的資源。
不帶 savepoint_name  transaction_name  ROLLBACK TRANSACTION 回滾到事務的起點。嵌套事務時,該語句將全部內層事務回滾到最遠的 BEGIN TRANSACTION 語句。在這兩種狀況下,ROLLBACK TRANSACTION 均將 @@TRANCOUNT 系統函數減爲 0ROLLBACK 
TRANSACTION savepoint_name 
不減小 @@TRANCOUNT

Note: 
ROLLBACK TRANSACTION 
語句若指定 savepoint_name 則不釋聽任何鎖。
在由 BEGIN DISTRIBUTED TRANSACTION 顯式啓動或從本地事務升級而來的分佈式事務中,ROLLBACK TRANSACTION 不能
引用savepoint_name在執行 COMMIT TRANSACTION 語句後不能回滾事務

在事務內容許有重複的保存點名稱,但 ROLLBACK TRANSACTION 若使用重複的保存點名稱,則只回滾到最近的使用該保存點名稱的SAVE TRANSACTION

在存儲過程當中,不帶 savepoint_name  transaction_name  ROLLBACK TRANSACTION 語句將全部語句回滾到最遠的BEGINTRANSACTION。在存儲過程當中,ROLLBACK TRANSACTION 語句使 @@TRANCOUNT 在觸發器完成時的值不一樣於調用該存儲過程時的@@TRANCOUNT 值,而且生成一個信息。該信息不影響後面的處理。

若是在觸發器中發出 ROLLBACK TRANSACTION:將回滾對當前事務中的那一點所作的全部數據修改,包括觸發器所作的修改。 
觸發器繼續執行 ROLLBACK 語句以後的全部其他語句。若是這些語句中的任意語句修改數據,則不回滾這些修改。執行其他的語句不會激發嵌套觸發器。在批處理中,不執行全部位於激發觸發器的語句以後的語句。每次進入觸發器,@@TRANCOUNT 就增長 1,即便在自動提交模式下也是如此。(系統將觸發器視做隱性嵌套事務。)

在存儲過程當中,ROLLBACK TRANSACTION 語句不影響調用該過程的批處理中的後續語句;
將執行批處理中的後續語句。在觸發器中,ROLLBACK TRANSACTION 語句終止含有激發觸發器的語句的批處理;
不執行批處理中的後續語句。

ROLLBACK TRANSACTION 語句不生成顯示給用戶的信息。若是在存儲過程或觸發器中須要警告,請使用 RAISERROR 或 PRINT 語句。RAISERROR 是用於指出錯誤的首選語句。

ROLLBACK 對遊標的影響由下面三個規則定義: 
當 CURSOR_CLOSE_ON_COMMIT 設置爲 ON 時,ROLLBACK 關閉但不釋放全部打開的遊標。 
當 CURSOR_CLOSE_ON_COMMIT 設置爲 OFF 時,ROLLBACK 不影響任何打開的同步 STATIC 或 INSENSITIVE 遊標不影響已徹底填充的異步 STATIC 遊標。將關閉但不釋聽任何其它類型的打開的遊標。 
對於致使終止批處理並生成內部回滾的錯誤,將釋放在含有該錯誤語句的批處理內聲明的全部遊標。
不論遊標的類型或 CURSOR_CLOSE_ON_COMMIT 的設置,全部遊標均將被釋放,其中包括在該錯誤批處理所調用的存儲過程內聲明的遊標。在該錯誤批處理以前的批處理內聲明的遊標以規則 1 和 2 爲準。死鎖錯誤就屬於這類錯誤。在觸發器中發出的 ROLLBACK 語句也 自動生成這類錯誤。

權限
ROLLBACK TRANSACTION 權限默認授予任何有效用戶。
例子:

begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A

-- select * into demo2 from demo1

create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction

COMMIT TRANSACTION
標誌一個成功的隱性事務或用戶定義事務的結束。若是 @@TRANCOUNT  1COMMIT

TRANSACTION 使得自從事務開始以來所執行的 全部數據修改爲爲數據庫的永久部分,釋放鏈接

佔用的資源,並將 @@TRANCOUNT 減小到 0。若是@@TRANCOUNT 大於 1,則COMMIT

TRANSACTION 使 @@TRANCOUNT  1 遞減。

只有當事務所引用的全部數據的邏輯都正確時,發出 COMMIT TRANSACTION 命令。
COMMIT WORK
標誌事務的結束。
語法
COMMIT [ WORK ]

註釋
此語句的功能與 COMMIT TRANSACTION 相同,但 COMMIT TRANSACTION 接受用戶定義的事務

名稱。這個指定或沒有指定可選關鍵字WORK  COMMIT 語法與 SQL-92 兼容

例子
begin transaction a
insert into demo values('BB','B term')
commit TRANSACTION A

隱性事務
當鏈接以隱性事務模式進行操做時,SQL Server將在提交或回滾當前事務後自動啓動新事務。無須描述事務的開始,只需提交或

回滾每一個事務。隱性事務模式生成連續的事務鏈。

在爲鏈接將隱性事務模式設置爲打開以後,當 SQL Server 首次執行下列任何語句時,都會自動啓動一個事務:

 

ALTER TABLE

INSERT

 

CREATE

OPEN

 

DELETE

REVOKE

 

DROP

SELECT

 

FETCH

TRUNCATE TABLE

 

GRANT

UPDATE

在發出 COMMIT  ROLLBACK 語句以前,該事務將一直保持有效。在第一個事務被提交或回滾以後,下次當鏈接執行這些語句

中的任何語句時,SQL Server 都將自動啓動一個新事務。SQL Server 將不斷地生成一個隱性事務鏈,

直到隱性事務模式關閉爲止

例子:
begin transaction 
save transaction A

insert into demo values('BB','B term')
rollback TRANSACTION A

create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction
-- 
 Create table demo2  SQL Server 已經隱式建立一個Trans,知道提交或回滾

嵌套事務處理:

1 Trans 嵌套,將內部的trans 合併到外部並造成一個Trans.

begin tran t1

----In the first trans .
Insert into demo2(name,age) values('lis',1)

---Second Trans begin transaction t2 
insert into demo values('BB','B term')
commit transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
rollback transaction t1

Note:

在一系列嵌套的事務中用一個事務名給多個事務命名對該事務沒有什麼影響。系統僅登記第一個(最外部的)事務名。回滾

到其它任何名字(有效的保存點名除外)都會產生錯誤

事實上,任何在回滾以前執行的語句都沒有在錯誤發生時回滾。這語句僅當外層的事務回滾時纔會進行回滾。

例:內部事務回滾SQL server 報錯。

begin tran t1 
Insert into demo2(name,age) values('lis',1)
---Second Trans

--Server: Msg 6401, Level 16, State 1, Line 6
---Cannot roll back t2. No transaction or savepoint of that name was found.
begin transaction t2 
insert into demo values('BB','B term')
rollback transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1

例: 內部事務提交SQL server 不會報錯。

begin tran t1 
Insert into demo2(name,age) values('lis',1)
---Second Trans no error
begin transaction t2 
insert into demo values('BB','B term')
commit transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1

SQL Server 的隔離級別:

1: 設置TimeOut 參數

Set Lock_TimeOut 5000

被鎖超時5秒將自動解鎖

Set Lock_TimeOut 0

產當即解鎖,返回Error 默認爲-1,無限等待

2

(SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ | SERIALIZABLE
}

READ COMMITTED

指定在讀取數據時控制共享鎖以免髒讀,但數據可在事務結束前更改,從而產生不可重複讀取或

幻像數據。該選項是SQL Server 的默認值。

避免髒讀,並在其餘session 在事務中不能對已有數據進行修改。共享鎖。

READ UNCOMMITTED

執行髒讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設置該選項時,能夠對數

據執行未提交讀或髒讀;在事務結束前能夠更改數據內的數值,行也能夠出如今數據集中或從數據

集消失。該選項的做用與在事務內全部語句中的全部表上設置 NOLOCK 相同。這是四個隔離級別中

限制最小的級別。

REPEATABLE READ

鎖定查詢中使用的全部數據以防止其餘用戶更新數據,可是其餘用戶能夠將新的幻像行插入數據

集,且幻像行包括在當前事務的後續讀取中。由於併發低於默認隔離級別,因此應只在必要時才使

用該選項。

SERIALIZABLE

在數據集上放置一個範圍鎖,以防止其餘用戶在事務完成以前更新數據集或將行插入數據集內。這

是四個隔離級別中限制最大的級別。由於併發級別較低,因此應只在必要時才使用該選項。該選項

的做用與在事務內全部 SELECT 語句中的全部表上設置 HOLDLOCK 相同。

相關文章
相關標籤/搜索