事务定义Q?/span>
事务是单个的工作单元。如果某一事务成功Q则在该事务中进行的所有数据更改均?/span>
提交Q成为数据库中的怹l成部分。如果事务遇到错误且必须取消或回滚,则所?/span>
数据更改均被清除?/span>
事务三种q行模式Q?/span>
自动提交事务
每条单独的语句都是一个事务?/span>
昑ּ事务
每个事务均以
BEGIN TRANSACTION
语句昑ּ开始,
?/span>
COMMIT
?/span>
ROLLBACK
语句昑ּl束?/span>
隐性事?/span>
在前一个事务完成时C务隐式启动,但每个事务仍?/span>
COMMIT
?/span>
ROLLBACK
语句
昑ּ完成?/span>
事务操作的语法:
BEGIN TRANSACTION
BEGIN DISTRIBUTED TRANSACTION
COMMIT TRANSACTION
COMMIT WORK
ROLLBACK WORK
SAVE TRANSACTION
BEGIN TRANSACTION
BEGIN TRANSACTION
标记一个显式本C务的起始炏V?/span>
BEGIN TRANSACTION
?/span>
@@TRANCOUNT
?/span>
1
?/span>
BEGIN TRANSACTION
代表一点,p接引用的数据在该Ҏ逻辑和物理上都一致的。如果遇上错误,?/span>
BEGIN TRANSACTION
之后的所有数据改动都能进行回滚,以将数据q回到已知的一致状?/span>
。每个事务l执行直到它无误地完成ƈ且用
COMMIT TRANSACTION
Ҏ据库作永久的改动Q或者遇上错误ƈ且用
ROLLBACK TRANSACTION
语句擦除所有改?/span>
语法
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ]
例子Q?/span>
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)
理?/span>
Transact-SQL
分布式事务的起始?/span>
语法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]
参数
transaction_name
是用户定义的事务名,用于跟踪
MS DTC
实用工具中的分布式事务?/span>
transaction_name
必须W合标识W规则,但是仅用头
32
个字W?/span>
@tran_name_variable
是用户定义的一个变量名Q它含有一个事务名Q该事务名用于跟t?/span>
MS DTC
实用工具中的分布式事务。必ȝ
char
?/span>
varchar
?/span>
nchar
?/span>
nvarchar
数据cd声明该变量?/span>
注释
执行
BEGIN DISTRIBUTED TRANSACTION
语句的服务器是事务创ZhQƈ且控制事务的完成
当连接发出后l?/span>
COMMIT TRANSACTION
?/span>
ROLLBACK TRANSACTION
语句Ӟ
L服务器请?/span>
MS DTC
在所涉及的服务器间管理分布式事务的完成?/span>
有两个方法可远E?/span>
SQL
服务器登记在一个分布式事务中:
分布式事务中已登记的q接执行一个远E存储过E调用,该调用引用一个远E服务器?/span>
分布式事务中已登记的q接执行一个分布式查询Q该查询引用一个远E服务器?/span>
CZ
本例在本地和q程数据库上更新作者的姓。本地和q程数据库将同时提交或同时回滚本事务?/span>
说明
当前?/span>
SQL Server
上必d?/span>
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:
如果需要连接远E?/span>
DB,
如果?/span>
linkServer
方式q接的话Q一定要修该
linkServer
?/span>
RPC
选项|ؓ
True
?/span>
SET XACT_ABORT
指定?/span>
Transact-SQL
语句产生q行旉误时Q?/span>
Microsoft? SQL Server?
是否自动回滚当前事务?/span>
(
可以比较单的理解Q如果中间有M一?/span>
SQL
出错Q所?/span>
SQL
全部回滚
.
特别适用?/span>
Procedure
中间调用
Procedure
Q如果第一?/span>
Procedure Ok
Q被调用?/span>
Procedure
中间有错误,如果
SET XACT_ABORT=false
Q则出错的部分回滚,其他部分提交Q当然外?/span>
Procedure
也提交。)
.
---
在分布式
Trans
中一定要注意讄下面参数
(XACT_ABORT)
语法
SET XACT_ABORT { ON | OFF }
注释
?/span>
SET XACT_ABORT
?/span>
ON
Ӟ如果
Transact-SQL
语句产生q行旉误,整个事务终止ƈ回滚。ؓ
OFF
Ӟ只回滚生错误的
Transact-SQL
语句Q而事务将l箋q行处理。编译错误(如语法错误)不受
SET XACT_ABORT
的媄响?/span>
对于大多?/span>
OLE DB
提供E序Q包?/span>
SQL Server
Q,隐性或昑ּ事务中的数据修改语句必须?/span>
XACT_ABORT
讄?/span>
ON
?/span>
SET XACT_ABORT
的设|是在执行或q行时设|,而不是在分析时设|?/span>
CZ
下例D在含有其?/span>
Transact-SQL
语句的事务中发生q反外键错误。在W一个语句集中生错误,但其它语句均成功执行且事务成?/span>
提交。在W二个语句集中,
SET XACT_ABORT
讄?/span>
ON
。这D语句错误使批处理l止Qƈ使事务回滚?/span>
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
在事务内讄保存炏V?/span>
语法
SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
参数
savepoint_name
是指z保存点的名称。保存点名称必须W合标识W规则,但只使用?/span>
32
个字W?/span>
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称?/span>
必须?/span>
char
?/span>
varchar
?/span>
nchar
?/span>
nvarchar
数据cd声明该变量?/span>
注释
用户可以在事务内讄保存Ҏ标记。保存点定义如果有条件地取消事务的一部分Q事
务可以返回的位置。如果将事务回滚C存点Q则必须Q如果需要,使用更多?/span>
Transact-SQL
语句?/span>
COMMIT TRANSACTION
语句Ql完成事务,或者必(通过事务回滚到其v始点Q完全取消事务。若要取消整个事务,请?/span>
ROLLBACK TRANSACTION transaction_name
格式。这撤消事务的所
有语句和q程?/span>
Note
Q?/span>
1
Q?/span>
在由
BEGIN DISTRIBUTED TRANSACTION
昑ּ启动或从本地事务升而来的分布式事务中,不支?/span>
SAVE TRANSACTION
?/span>
2
Q?/span>
当事务开始时Q将一直控制事务中所使用的资源直C务完成(也就是锁定)。当事务的一部分回滚C存点Ӟl控制资源直C务完成(或者回滚全部事务)?/span>
例子Q?/span>
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
显式事务或隐性事务回滚到事务的vҎ事务内的某个保存炏V?/span>
语法
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]
参数
transaction_name
是给
BEGIN TRANSACTION
上的事务指派的名U?/span>
transaction_name
必须W合标识W规则,但只使用事务名称的前
32
个字W。嵌?/span>
事务Ӟ
transaction_name
必须是来自最q的
BEGIN TRANSACTION
语句的名U?/span>
@tran_name_variable
是用户定义的、含有有效事务名U的变量的名U。必ȝ
char
?/span>
varchar
?/span>
nchar
?/span>
nvarchar
数据cd声明该变量?/span>
savepoint_name
是来?/span>
SAVE TRANSACTION
语句?/span>
savepoint_name
?/span>
savepoint_name
必须W合标识W规则。当条g回滚只媄响事务的一部分时
?/span>
savepoint_name
?/span>
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称。必ȝ
char
?/span>
varchar
?/span>
nchar
?/span>
nvarchar
数据cd声明该变量?/span>
注释
ROLLBACK TRANSACTION
清除自事务的L或到某个保存Ҏ做的所有数据修攏V?/span>
ROLLBACK
q释攄事务控制的资源?/span>
不带
savepoint_name
?/span>
transaction_name
?/span>
ROLLBACK TRANSACTION
回滚C务的L。嵌套事务时Q该语句所有内层事务回滚到
最q的
BEGIN TRANSACTION
语句。在q两U情况下Q?/span>
ROLLBACK TRANSACTION
均将
@@TRANCOUNT
pȝ函数减ؓ
0
?/span>
ROLLBACK
TRANSACTION savepoint_name
不减?/span>
@@TRANCOUNT
?/span>
Note:
ROLLBACK TRANSACTION
语句若指?/span>
savepoint_name
则不释放M锁?/span>
在由
BEGIN DISTRIBUTED TRANSACTION
昑ּ启动或从本地事务升而来的分布式事务中,
ROLLBACK TRANSACTION
不能
引用
savepoint_name
?/span>
在执?/span>
COMMIT TRANSACTION
语句后不能回滚事?/span>
?/span>
在事务内允许有重复的保存点名Uͼ?/span>
ROLLBACK TRANSACTION
若用重复的保存点名Uͼ则只回滚到最q的使用该保存点名称?/span>
SAVE TRANSACTION
?/span>
在存储过E中Q不?/span>
savepoint_name
?/span>
transaction_name
?/span>
ROLLBACK TRANSACTION
语句所有语句回滚到最q的
BEGINTRANSACTION
。在存储q程中,
ROLLBACK TRANSACTION
语句?/span>
@@TRANCOUNT
在触发器完成时的g同于调用该存储过E时?/span>
@@TRANCOUNT
|q且生成一个信息。该信息不媄响后面的处理?/span>
如果在触发器中发?/span>
ROLLBACK TRANSACTION
Q将回滚对当前事务中的那一Ҏ做的所有数据修改,包括触发器所做的修改?/span>
触发器l执?/span>
ROLLBACK
语句之后的所有其余语句。如果这些语句中的Q意语句修Ҏ据,则不回滚q些修改。执行其余的语句不会Ȁ发嵌套触发器。在批处理中Q不执行所有位于激发触发器的语句之后的语句。每ơ进入触发器Q?/span>
@@TRANCOUNT
增?/span>
1
Q即使在自动提交模式下也是如此。(pȝ触发器视作隐性嵌套事务。)
在存储过E中Q?/span>
ROLLBACK TRANSACTION
语句不媄响调用该q程的批处理中的后箋语句Q?/span>
执行批处理中的后箋语句。在触发器中Q?/span>
ROLLBACK TRANSACTION
语句l止含有Ȁ发触发器的语句的批处理;
不执行批处理中的后箋语句?/span>
ROLLBACK TRANSACTION 语句不生成显C给用户的信息。如果在存储q程或触发器中需要警告,请?RAISERROR ?PRINT 语句。RAISERROR 是用于指出错误的首选语句?/span>
ROLLBACK Ҏ标的影响׃面三个规则定义:
?CURSOR_CLOSE_ON_COMMIT 讄?ON ӞROLLBACK 关闭但不释放所有打开的游标?
?CURSOR_CLOSE_ON_COMMIT 讄?OFF ӞROLLBACK 不媄响Q何打开的同?STATIC ?INSENSITIVE 游标不媄响已完全填充的异?STATIC 游标。将关闭但不释放M其它cd的打开的游标?
对于Dl止批处理ƈ生成内部回滚的错误,释攑֜含有该错误语句的批处理内声明的所有游标?br />不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设|,所有游标均被释放Q其中包括在该错误批处理所调用的存储过E内声明的游标。在该错误批处理之前的批处理内声明的游标以规?1 ?2 为准。死锁错误就属于q类错误。在触发器中发出?ROLLBACK 语句?自动生成q类错误?
权限
ROLLBACK TRANSACTION 权限默认授予M有效用户?br />
例子Q?/span>
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
标志一个成功的隐性事务或用户定义事务的结束。如?/span>
@@TRANCOUNT
?/span>
1
Q?/span>
COMMIT
TRANSACTION
使得自从事务开始以来所执行?/span>
所有数据修Ҏ为数据库的永久部分,释放q接
占用的资源,q将
@@TRANCOUNT
减少?/span>
0
。如?/span>
@@TRANCOUNT
大于
1
Q则
COMMIT
TRANSACTION
?/span>
@@TRANCOUNT
?/span>
1
递减?/span>
只有当事务所引用的所有数据的逻辑都正时Q发?/span>
COMMIT TRANSACTION
命o?/span>
COMMIT WORK
标志事务的结束?/span>
语法
COMMIT [ WORK ]
注释
此语句的功能?/span>
COMMIT TRANSACTION
相同Q但
COMMIT TRANSACTION
接受用户定义的事?/span>
名称。这个指定或没有指定可选关键字
WORK
?/span>
COMMIT
语法?/span>
SQL-92
兼容
例子
Q?/span>
begin transaction a
insert into demo values('BB','B term')
commit TRANSACTION A
隐性事?/span>
当连接以隐性事务模式进行操作时Q?/span>
SQL Server
在提交或回滚当前事务后自动启动C务。无LqC务的开始,只需提交?/span>
回滚每个事务。隐性事务模式生成连l的事务链?/span>
在ؓq接隐性事务模式设|ؓ打开之后Q当
SQL Server
首次执行下列M语句Ӟ都会自动启动一个事务:
|
ALTER TABLE
|
INSERT
|
|
CREATE
|
OPEN
|
|
DELETE
|
REVOKE
|
|
DROP
|
SELECT
|
|
FETCH
|
TRUNCATE TABLE
|
|
GRANT
|
UPDATE
|
在发?/span>
COMMIT
?/span>
ROLLBACK
语句之前Q该事务一直保持有效。在W一个事务被提交或回滚之后,下次当连接执行这些语?/span>
中的M语句Ӟ
SQL Server
都将自动启动一个新事务?/span>
SQL Server
不断地生成一个隐性事务链Q?/span>
直到隐性事务模式关闭ؓ?/span>
例子Q?/span>
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
--
?/span>
Create table demo2
?/span>
SQL Server
已经隐式创徏一?/span>
Trans,
知道提交或回?/span>
嵌套事务处理
:
1
Q?/span>
Trans
嵌套Q将内部?/span>
trans
合ƈ到外部ƈ形成一?/span>
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:
在一pd嵌套的事务中用一个事务名l多个事务命名对该事务没有什么媄响。系l仅登记W一个(最外部的)事务名?span>回滚
到其它Q何名字(有效的保存点名除外)都会产生错误
?/span>
事实上,M在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会q行回滚?/span>
例:内部事务回滚
SQL server
报错?/span>
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
不会报错?/span>
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
U将自动解锁
Set Lock_TimeOut 0
产立卌锁,q回
Error
默认?/span>
-1
Q无限等?/span>
2
Q?/span>
(SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ | SERIALIZABLE
}
Q?/span>
READ COMMITTED
指定在读取数据时控制׃n锁以避免脏读Q但数据可在事务l束前更改,从而生不可重复读取或
qd数据。该选项?/span>
SQL Server
的默认倹{?/span>
避免脏读Qƈ在其?/span>
session
在事务中不能对已有数据进行修攏V共享锁?/span>
READ UNCOMMITTED
执行脏读?/span>
0
U隔锁定,q表CZ发出׃n锁,也不接受排它锁。当讄该选项Ӟ可以Ҏ
据执行未提交L脏读Q在事务l束前可以更Ҏ据内的数|行也可以出现在数据集中或从数?/span>
集消失。该选项的作用与在事务内所有语句中的所有表上设|?/span>
NOLOCK
相同。这是四个隔ȝ别中
限制最的U别?/span>
REPEATABLE READ
锁定查询中用的所有数据以防止其他用户更新数据Q但是其他用户可以将新的qd行插入数?/span>
集,且像行包括在当前事务的后箋d中。因为ƈ发低于默认隔ȝ别,所以应只在必要时才?/span>
用该选项?/span>
SERIALIZABLE
在数据集上放|一个范围锁Q以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这
是四个隔ȝ别中限制最大的U别。因为ƈ发别较低,所以应只在必要时才使用该选项。该选项
的作用与在事务内所?/span>
SELECT
语句中的所有表上设|?/span>
HOLDLOCK
相同?/span>

]]>