成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

SQL Server數(shù)據(jù)庫事務(wù)處理詳解

2010-08-28 10:52:28來源:西部e網(wǎng)作者:

事務(wù)定義:

事務(wù)是單個的工作單元。如果某一事務(wù)成功,則在該事務(wù)中進(jìn)行的所有數(shù)據(jù)更改均會提交,成為數(shù)據(jù)庫中的永久組成部分。如果事務(wù)遇到錯誤且必須取消或回滾,則所有數(shù)據(jù)更改均被清除。

事務(wù)三種運(yùn)行模式:
自動提交事務(wù)每條單獨(dú)的語句都是一個事務(wù)。顯式事務(wù)每個事務(wù)均以 BEGIN TRANSACTION 語句顯式開始, COMMIT ROLLBACK 語句顯式結(jié)束。隱性事務(wù)在前一個事務(wù)完成時新事務(wù)隱式啟動,但每個事務(wù)仍以 COMMIT ROLLBACK 語句顯式完成。

事務(wù)操作的語法:

BEGIN TRANSACTION
BEGIN DISTRIBUTED TRANSACTION
COMMIT TRANSACTION
COMMIT WORK
ROLLBACK WORK
SAVE TRANSACTION
BEGIN TRANSACTION

BEGIN TRANSACTION
標(biāo)記一個顯式本地事務(wù)的起始點(diǎn)。

BEGIN TRANSACTION @@TRANCOUNT 1

BEGIN TRANSACTION 代表一點(diǎn),由連接引用的數(shù)據(jù)在該點(diǎn)是邏輯和物理上都一致的。如果遇上錯誤,在 BEGIN TRANSACTION 之后的所有數(shù)據(jù)改動都能進(jìn)行回滾,以將數(shù)據(jù)返回到已知的一致狀態(tài) 。每個事務(wù)繼續(xù)執(zhí)行直到它無誤地完成并且用 COMMIT TRANSACTION 對數(shù)據(jù)庫作永久的改動,或者遇上錯誤并且用 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 分布式事務(wù)處理協(xié)調(diào)器 (MS DTC) 管理的 Transact-SQL 分布式事務(wù)的起始。

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

參數(shù)
transaction_name
是用戶定義的事務(wù)名,用于跟蹤 MS DTC 實(shí)用工具中的分布式事務(wù)。 transaction_name 必須符合標(biāo)識符規(guī)則,但是僅使用頭 32 個字符

@tran_name_variable
是用戶定義的一個變量名,它含有一個事務(wù)名,該事務(wù)名用于跟蹤 MS DTC 實(shí)用工具中的分布式事務(wù)。必須用 charvarcharnchar nvarchar 數(shù)據(jù)類型聲明該變量。

注釋
執(zhí)行BEGIN DISTRIBUTED TRANSACTION 語句的服務(wù)器是事務(wù)創(chuàng)建人,并且控制事務(wù)的完成

當(dāng)連接發(fā)出后續(xù) COMMIT TRANSACTION ROLLBACK TRANSACTION 語句時,
主控服務(wù)器請求 MS DTC 在所涉及的服務(wù)器間管理分布式事務(wù)的完成。
有兩個方法可將遠(yuǎn)程 SQL 服務(wù)器登記在一個分布式事務(wù)中:

分布式事務(wù)中已登記的連接執(zhí)行一個遠(yuǎn)程存儲過程調(diào)用,該調(diào)用引用一個遠(yuǎn)程服務(wù)器。
分布式事務(wù)中已登記的連接執(zhí)行一個分布式查詢,該查詢引用一個遠(yuǎn)程服務(wù)器。

示例
本例在本地和遠(yuǎn)程數(shù)據(jù)庫上更新作者的姓。本地和遠(yuǎn)程數(shù)據(jù)庫將同時提交或同時回滾本事務(wù)。

說明
當(dāng)前的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:
如果需要連接遠(yuǎn)程DB,如果是linkServer 方式連接的話,一定要修該linkServer RPC 選項(xiàng)置為 True

SET XACT_ABORT
指定當(dāng) Transact-SQL 語句產(chǎn)生運(yùn)行時錯誤時,Microsoft? SQL Server? 是否自動回滾當(dāng)前事務(wù)。

( 可以比較簡單的理解,如果中間有任何一句SQL 出錯,所有SQL全部回滾.特別適用于 Procedure 中間調(diào)用Procedure ,如果第一個Procedure Ok,被調(diào)用的Procedure 中間有錯誤,如果SET XACT_ABORT=false,則出錯的部分回滾,其他部分提交,當(dāng)然外部Procedure 也提交。).

---在分布式Trans中一定要注意設(shè)置下面參數(shù)(XACT_ABORT)

語法SET XACT_ABORT { ON | OFF }

注釋 當(dāng) SET XACT_ABORT ON 時,如果 Transact-SQL 語句產(chǎn)生運(yùn)行時錯誤,整個事務(wù)將終止并回滾。為 OFF 時,只回滾產(chǎn)生錯誤的Transact-SQL 語句,而事務(wù)將繼續(xù)進(jìn)行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。

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

SET XACT_ABORT 的設(shè)置是在執(zhí)行或運(yùn)行時設(shè)置,而不是在分析時設(shè)置。

示例 下例導(dǎo)致在含有其它 Transact-SQL 語句的事務(wù)中發(fā)生違反外鍵錯誤。在第一個語句集中產(chǎn)生錯誤,但其它語句均成功執(zhí)行且事務(wù)成功
提交。在第二個語句集中,SET XACT_ABORT 設(shè)置為 ON。這導(dǎo)致語句錯誤使批處理終止,并使事務(wù)回滾。

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
在事務(wù)內(nèi)設(shè)置保存點(diǎn)。

語法 SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
參數(shù) savepoint_name
是指派給保存點(diǎn)的名稱。保存點(diǎn)名稱必須符合標(biāo)識符規(guī)則,但只使用前 32 個字符。
@savepoint_variable
是用戶定義的、含有有效保存點(diǎn)名稱的變量的名稱。
必須用 charvarcharnchar nvarchar 數(shù)據(jù)類型聲明該變量。 注釋
用戶可以在事務(wù)內(nèi)設(shè)置保存點(diǎn)或標(biāo)記。保存點(diǎn)定義如果有條件地取消事務(wù)的一部分,事 務(wù)可以返回的位置。如果將事務(wù)回滾到保存點(diǎn),則必須(如果需要,使用更多的 Transact-SQL 語句和 COMMIT TRANSACTION 語句)繼續(xù)完成事務(wù),或者必須(通過將事務(wù)回滾到其起始點(diǎn))完全取消事務(wù)。若要取消整個事務(wù),請使用 ROLLBACK TRANSACTION transaction_name 格式。這將撤消事務(wù)的所 有語句和過程。

Note1 在由 BEGIN DISTRIBUTED TRANSACTION 顯式啟動或從本地事務(wù)升級而來的分布式事務(wù)中,不支持 SAVE TRANSACTION

2當(dāng)事務(wù)開始時,將一直控制事務(wù)中所使用的資源直到事務(wù)完成(也就是鎖定)。當(dāng)將事務(wù)的一部分回滾到保存點(diǎn)時,將繼續(xù)控制資源直到事務(wù)完成(或者回滾全部事務(wù))。

例子: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

將顯式事務(wù)或隱性事務(wù)回滾到事務(wù)的起點(diǎn)或事務(wù)內(nèi)的某個保存點(diǎn)。
語法
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]

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

注釋 ROLLBACK TRANSACTION 清除自事務(wù)的起點(diǎn)或到某個保存點(diǎn)所做的所有數(shù)據(jù)修改。ROLLBACK 還釋放由事務(wù)控制的資源。
不帶 savepoint_name transaction_name ROLLBACK TRANSACTION 回滾到事務(wù)的起點(diǎn)。嵌套事務(wù)時,該語句將所有內(nèi)層事務(wù)回滾到 最遠(yuǎn)的 BEGIN TRANSACTION 語句。在這兩種情況下,ROLLBACK TRANSACTION 均將 @@TRANCOUNT 系統(tǒng)函數(shù)減為 0ROLLBACK
TRANSACTION savepoint_name
不減少 @@TRANCOUNT

Note:
ROLLBACK TRANSACTION
語句若指定 savepoint_name 則不釋放任何鎖。
在由 BEGIN DISTRIBUTED TRANSACTION 顯式啟動或從本地事務(wù)升級而來的分布式事務(wù)中,ROLLBACK TRANSACTION 不能
引用savepoint_name在執(zhí)行 COMMIT TRANSACTION 語句后不能回滾事務(wù)

在事務(wù)內(nèi)允許有重復(fù)的保存點(diǎn)名稱,但 ROLLBACK TRANSACTION 若使用重復(fù)的保存點(diǎn)名稱,則只回滾到最近的使用該保存點(diǎn)名稱的SAVE TRANSACTION

在存儲過程中,不帶 savepoint_name transaction_name ROLLBACK TRANSACTION 語句將所有語句回滾到最遠(yuǎn)的 BEGINTRANSACTION。在存儲過程中,ROLLBACK TRANSACTION 語句使 @@TRANCOUNT 在觸發(fā)器完成時的值不同于調(diào)用該存儲過程時的@@TRANCOUNT 值,并且生成一個信息。該信息不影響后面的處理。

如果在觸發(fā)器中發(fā)出 ROLLBACK TRANSACTION:將回滾對當(dāng)前事務(wù)中的那一點(diǎn)所做的所有數(shù)據(jù)修改,包括觸發(fā)器所做的修改。
觸發(fā)器繼續(xù)執(zhí)行 ROLLBACK 語句之后的所有其余語句。如果這些語句中的任意語句修改數(shù)據(jù),則不回滾這些修改。執(zhí)行其余的語句不會激發(fā)嵌套觸發(fā)器。在批處理中,不執(zhí)行所有位于激發(fā)觸發(fā)器的語句之后的語句。每次進(jìn)入觸發(fā)器,@@TRANCOUNT 就增加 1,即使在自動提交模式下也是如此。(系統(tǒng)將觸發(fā)器視作隱性嵌套事務(wù)。)

在存儲過程中,ROLLBACK TRANSACTION 語句不影響調(diào)用該過程的批處理中的后續(xù)語句;
將執(zhí)行批處理中的后續(xù)語句。在觸發(fā)器中,ROLLBACK TRANSACTION 語句終止含有激發(fā)觸發(fā)器的語句的批處理;
不執(zhí)行批處理中的后續(xù)語句。

ROLLBACK TRANSACTION 語句不生成顯示給用戶的信息。如果在存儲過程或觸發(fā)器中需要警告,請使用 RAISERROR 或 PRINT 語句。RAISERROR 是用于指出錯誤的首選語句。

ROLLBACK 對游標(biāo)的影響由下面三個規(guī)則定義:
當(dāng) CURSOR_CLOSE_ON_COMMIT 設(shè)置為 ON 時,ROLLBACK 關(guān)閉但不釋放所有打開的游標(biāo)。
當(dāng) CURSOR_CLOSE_ON_COMMIT 設(shè)置為 OFF 時,ROLLBACK 不影響任何打開的同步 STATIC 或 INSENSITIVE 游標(biāo)不影響已完全填充的異步 STATIC 游標(biāo)。將關(guān)閉但不釋放任何其它類型的打開的游標(biāo)。
對于導(dǎo)致終止批處理并生成內(nèi)部回滾的錯誤,將釋放在含有該錯誤語句的批處理內(nèi)聲明的所有游標(biāo)。
不論游標(biāo)的類型或 CURSOR_CLOSE_ON_COMMIT 的設(shè)置,所有游標(biāo)均將被釋放,其中包括在該錯誤批處理所調(diào)用的存儲過程內(nèi)聲明的游標(biāo)。在該錯誤批處理之前的批處理內(nèi)聲明的游標(biāo)以規(guī)則 1 和 2 為準(zhǔn)。死鎖錯誤就屬于這類錯誤。在觸發(fā)器中發(fā)出的 ROLLBACK 語句也 自動生成這類錯誤。

權(quán)限
ROLLBACK TRANSACTION 權(quán)限默認(rèn)授予任何有效用戶。
例子:

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
標(biāo)志一個成功的隱性事務(wù)或用戶定義事務(wù)的結(jié)束。如果 @@TRANCOUNT 1COMMIT

TRANSACTION 使得自從事務(wù)開始以來所執(zhí)行的 所有數(shù)據(jù)修改成為數(shù)據(jù)庫的永久部分,釋放連接

占用的資源,并將 @@TRANCOUNT 減少到 0。如果@@TRANCOUNT 大于 1,則COMMIT

TRANSACTION 使 @@TRANCOUNT 1 遞減。

只有當(dāng)事務(wù)所引用的所有數(shù)據(jù)的邏輯都正確時,發(fā)出 COMMIT TRANSACTION 命令。
COMMIT WORK
標(biāo)志事務(wù)的結(jié)束。
語法
COMMIT [ WORK ]

注釋
此語句的功能與 COMMIT TRANSACTION 相同,但 COMMIT TRANSACTION 接受用戶定義的事務(wù)

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

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

隱性事務(wù)
當(dāng)連接以隱性事務(wù)模式進(jìn)行操作時,SQL Server將在提交或回滾當(dāng)前事務(wù)后自動啟動新事務(wù)。無須描述事務(wù)的開始,只需提交或

回滾每個事務(wù)。隱性事務(wù)模式生成連續(xù)的事務(wù)鏈。

在為連接將隱性事務(wù)模式設(shè)置為打開之后,當(dāng) SQL Server 首次執(zhí)行下列任何語句時,都會自動啟動一個事務(wù):

 

ALTER TABLE

INSERT

 

CREATE

OPEN

 

DELETE

REVOKE

 

DROP

SELECT

 

FETCH

TRUNCATE TABLE

 

GRANT

UPDATE

在發(fā)出 COMMIT ROLLBACK 語句之前,該事務(wù)將一直保持有效。在第一個事務(wù)被提交或回滾之后,下次當(dāng)連接執(zhí)行這些語句

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

直到隱性事務(wù)模式關(guān)閉為止

例子:
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 已經(jīng)隱式創(chuàng)建一個Trans,知道提交或回滾

嵌套事務(wù)處理:

1 Trans 嵌套,將內(nèi)部的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:

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

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

事實(shí)上,任何在回滾之前執(zhí)行的語句都沒有在錯誤發(fā)生時回滾。這語句僅當(dāng)外層的事務(wù)回滾時才會進(jìn)行回滾。

例:內(nèi)部事務(wù)回滾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

例: 內(nèi)部事務(wù)提交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: 設(shè)置TimeOut 參數(shù)

Set Lock_TimeOut 5000

被鎖超時5秒將自動解鎖

Set Lock_TimeOut 0

產(chǎn)立即解鎖,返回Error 默認(rèn)為-1,無限等待

2

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

READ COMMITTED

指定在讀取數(shù)據(jù)時控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或

幻像數(shù)據(jù)。該選項(xiàng)是SQL Server 的默認(rèn)值。

避免臟讀,并在其他session 在事務(wù)中不能對已有數(shù)據(jù)進(jìn)行修改。共享鎖。

READ UNCOMMITTED

執(zhí)行臟讀或 0 級隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當(dāng)設(shè)置該選項(xiàng)時,可以對數(shù)

據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)

集消失。該選項(xiàng)的作用與在事務(wù)內(nèi)所有語句中的所有表上設(shè)置 NOLOCK 相同。這是四個隔離級別中

限制最小的級別。

REPEATABLE READ

鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻像行插入數(shù)據(jù)

集,且幻像行包括在當(dāng)前事務(wù)的后續(xù)讀取中。因?yàn)椴l(fā)低于默認(rèn)隔離級別,所以應(yīng)只在必要時才使

用該選項(xiàng)。

SERIALIZABLE

在數(shù)據(jù)集上放置一個范圍鎖,以防止其他用戶在事務(wù)完成之前更新數(shù)據(jù)集或?qū)⑿胁迦霐?shù)據(jù)集內(nèi)。這

是四個隔離級別中限制最大的級別。因?yàn)椴l(fā)級別較低,所以應(yīng)只在必要時才使用該選項(xiàng)。該選項(xiàng)

的作用與在事務(wù)內(nèi)所有 SELECT 語句中的所有表上設(shè)置 HOLDLOCK 相同

關(guān)鍵詞:SQLServer
主站蜘蛛池模板: 平乐县| 柞水县| 古丈县| 晋州市| 邓州市| 自贡市| 正安县| 桓仁| 宜宾市| 鄂尔多斯市| 青铜峡市| 简阳市| 博客| 仁寿县| 沙田区| 富源县| 青田县| 偏关县| 察雅县| 河源市| 北安市| 工布江达县| 全椒县| 扶绥县| 关岭| 昌都县| 邢台市| 焦作市| 阿瓦提县| 常山县| 湖北省| 宁津县| 盖州市| 敦煌市| 临桂县| 靖边县| 康平县| 稻城县| 夏河县| 本溪市| 宜章县|