1.本地事务
语法:
BEGIN { TRAN | TRANSACTION } [ { transaction_name | @tran_name_variable } [ WITH MARK [ 'description' ] ] ] [ ; ]
参数:
transaction_name:分配给事务的名称。transaction_name 必须符合标识符规则,但标识符所包含的字符数不能大于 32
@tran_name_variable:用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。如果传递给该变量的字符多于 32 个,则仅使用前面的 32 个字符;其余的字符将被截断。
WITH MARK [ 'description' ]:指定在日志中标记事务。description 是描述该标记的字符串。长于 128 个字符的 description 先截断为 128 个字符,然后才存储到 msdb.dbo.logmarkhistory 表中
**如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记
示例:
begin transaction tran_name
--执行语句
if @@ERROR<>0
rollback transaction tran_name
else
commit transaction tran_name
**标记一个显式本地事务的起始点。BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减,ROLLBACK TRANSACTION 都将 @@TRANCOUNT 系统函数减小为 0。ROLLBACK TRANSACTION savepoint_name 不减小 @@TRANCOUNT
2.分布事务
使用 BEGIN DISTRIBUTED TRANSACTION 语句启动显式分布式事务。
语法:
BEGIN DISTRIBUTED { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] [ ; ]
参数:
transaction_name:用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,字符数必须 <= 32。
@tran_name_variable:用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量
示例:
BEGIN DISTRIBUTED TRANSACTION;
执行语句
COMMIT TRANSACTION;
GO
3.应该怎样处理事务过程产生的问题:
1.sql server 在发生 runtime 错误时,默认会 rollback 引起错误的语句,而继续执行后续语句。
解决1:
在事务语句最前面加上set xact_abort on
示例:
set xact_abort on
begin transaction
--sql语句
commit transaction
当 xact_abort 选项为 on 时,sql server 在遇到错误时会终止执行并 rollback 整个事务
解决2:
执行完一条sql 就判断@@error 状态
begin transaction
--执行sql 语句1
if @@error <> 0
begin
rollback transaction
end
--执行sql 语句2
if @@error <> 0
begin
rollback tran
end
commit tran
go
3.TRY ..Catch处理异常
begin tran
begin try
--执行sql 语句1
--执行sql 语句2
--执行sql 语句3
drop table verbal
end try
begin catch
if @@trancount > 0
rollback tran
end catch
if @@trancount > 0
commit tran
go
-
ERROR_NUMBER() 返回错误号。
-
ERROR_SEVERITY() 返回严重性。
-
ERROR_STATE() 返回错误状态号。
-
ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。
-
ERROR_LINE() 返回导致错误的例程中的行号。
-
ERROR_MESSAGE() 返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。