控制SQL Server 2005事务可以使用T-SQL或者是数据库应用程序接口API函数指定事务的开始,结束时间.系统还必须能够正确处理那些在是事务完成之前便终止事务的错误。
默认情况下,事务按连接级别进行管理。一个连接的事务模式发生变化对任何其他连接的事务模式没有影响。在一个连接上启动一个事务后,在事务结束之前,在该连接上所执行的所有T-SQL
语句都是该事务的一部分(比如新打开了一个查询窗口输入begin transaction testtran...后面省略多句T-SQL,如果没有进行commit或rollback,默认下该连接所有T-SQL语句都是属于事务
testtran)。
启动事务
SQL Server 2005 根据事务的模式分为三种。
1,显示事务:通过T-SQL或API函授发出的BEGIN TRANSACTION语句来启动显示事务。
T-SQL:
BEGIN TRANSACTION;
DELETE FROM dbo.Products WHERE ProductID = 1;
COMMIT TRANSACTION;
GO
ADO.NET API:
SqlTransaction tran = new SqlConnection(connectionString).BeginTransaction(IsolationLevel.ReadCommitted);
2,自动提交事务:Database Engine默认模式。无需指定事务开始,结束时间。
3,隐式事务:通过API函授,或Transact-SQL SET IMPLICIT_TRANSACTIONS ON指定启用隐式事务。每个语句会自动启动一个新事务,事务完成时,下一句语句又将启动一个新事务。
T-SQL:
SET IMPLICIT_TRANSACTIONS ON;
DELETE FROM dbo."Order Details" WHERE OrderID = 10250;--事务1开始,无需指定。
COMMIT TRANSACTION;
DELETE FROM dbo."Order Details" WHERE OrderID = 10251;--事务2开始,无需指定。
COMMIT TRANSACTION;
ADO.NET API:
TransactionScope ts = new TransactionScope();
结束事务
显示事务,隐式事务通过COMMIT,ROLLBACK语句结合事务,应用程序则通过API函数结束事务。
指定事务边界
T-SQL语句:
可以使用BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION、ROLLBACK WORK 和 SET IMPLICIT_TRANSACTIONS语句来描述事务。主要用与DB库,T-SQL脚本。
API 函数和方法:
如SqlTransaction类的Commit(),Rollback()函数。
每个事务都必须只由其中一种方法管理。在对同一事务使用两种方法会导致出现不确定的结果。例如,不应先使用 ODBC API 函数启动一个事务,再使用 Transact-SQL COMMIT 语句完成该事
务。这样将无法向 SQL Server ODBC 驱动程序通知已提交该事务。在这种情况下,应使用 ODBC SQLEndTran 函数结束该事务。
事务处理过程中的错误
如果某个错误使事务无法完成,SQL Server会回滚该事务并释放资源。如连接与数据库引擎连接中断,客户端崩溃或重新启动,该实例会回滚所有未完成的连接。如果客户端从该应用程序注销
,所有未完成的事务也会被回滚(这句我还没有理解是啥意思)。
如果事务中出现运行时错误(如违反约束),那么数据库引擎的默认行为是回滚该错误的语句。可以使用 SET XACT_ABORT 语句更改此行为。在执行 SET XACT_ABORT ON 语句后,任何运行时语句
错误都将导致自动回滚当前事务。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
如果出现运行时错误或者编译错误,T-SQL可以使用TRY...CATCH,如:
BEGIN TRY
BEGIN TRANSACTION;
DELETE FROM dbo.Orders WHERE OrderID = 10252;
DELETE FROM dbo."Order Details" WHERE OrderID = 10252;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
IF (XACT_STATE()) = -1
BEGIN
PRINT
N'The transaction is in an uncommittable state. ' +
'Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
-- Test if the transaction is active and valid.
IF (XACT_STATE()) = 1
BEGIN
PRINT
N'The transaction is committable. ' +
'Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH
GO
上面主要讲述了如何定义事务的边界(即开始,结束),SQL Server 2005中事务的模式以及事务中的错误处理。
参考资料:ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/udb9/html/0cbd323b-60e1-4aab-824d-129d266c0a74.htm
默认情况下,事务按连接级别进行管理。一个连接的事务模式发生变化对任何其他连接的事务模式没有影响。在一个连接上启动一个事务后,在事务结束之前,在该连接上所执行的所有T-SQL
语句都是该事务的一部分(比如新打开了一个查询窗口输入begin transaction testtran...后面省略多句T-SQL,如果没有进行commit或rollback,默认下该连接所有T-SQL语句都是属于事务
testtran)。
启动事务
SQL Server 2005 根据事务的模式分为三种。
1,显示事务:通过T-SQL或API函授发出的BEGIN TRANSACTION语句来启动显示事务。
T-SQL:
BEGIN TRANSACTION;
DELETE FROM dbo.Products WHERE ProductID = 1;
COMMIT TRANSACTION;
GO
ADO.NET API:
SqlTransaction tran = new SqlConnection(connectionString).BeginTransaction(IsolationLevel.ReadCommitted);
2,自动提交事务:Database Engine默认模式。无需指定事务开始,结束时间。
3,隐式事务:通过API函授,或Transact-SQL SET IMPLICIT_TRANSACTIONS ON指定启用隐式事务。每个语句会自动启动一个新事务,事务完成时,下一句语句又将启动一个新事务。
T-SQL:
SET IMPLICIT_TRANSACTIONS ON;
DELETE FROM dbo."Order Details" WHERE OrderID = 10250;--事务1开始,无需指定。
COMMIT TRANSACTION;
DELETE FROM dbo."Order Details" WHERE OrderID = 10251;--事务2开始,无需指定。
COMMIT TRANSACTION;
ADO.NET API:
TransactionScope ts = new TransactionScope();
结束事务
显示事务,隐式事务通过COMMIT,ROLLBACK语句结合事务,应用程序则通过API函数结束事务。
指定事务边界
T-SQL语句:
可以使用BEGIN TRANSACTION、COMMIT TRANSACTION、COMMIT WORK、ROLLBACK TRANSACTION、ROLLBACK WORK 和 SET IMPLICIT_TRANSACTIONS语句来描述事务。主要用与DB库,T-SQL脚本。
API 函数和方法:
如SqlTransaction类的Commit(),Rollback()函数。
每个事务都必须只由其中一种方法管理。在对同一事务使用两种方法会导致出现不确定的结果。例如,不应先使用 ODBC API 函数启动一个事务,再使用 Transact-SQL COMMIT 语句完成该事
务。这样将无法向 SQL Server ODBC 驱动程序通知已提交该事务。在这种情况下,应使用 ODBC SQLEndTran 函数结束该事务。
事务处理过程中的错误
如果某个错误使事务无法完成,SQL Server会回滚该事务并释放资源。如连接与数据库引擎连接中断,客户端崩溃或重新启动,该实例会回滚所有未完成的连接。如果客户端从该应用程序注销
,所有未完成的事务也会被回滚(这句我还没有理解是啥意思)。
如果事务中出现运行时错误(如违反约束),那么数据库引擎的默认行为是回滚该错误的语句。可以使用 SET XACT_ABORT 语句更改此行为。在执行 SET XACT_ABORT ON 语句后,任何运行时语句
错误都将导致自动回滚当前事务。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
如果出现运行时错误或者编译错误,T-SQL可以使用TRY...CATCH,如:
BEGIN TRY
BEGIN TRANSACTION;
DELETE FROM dbo.Orders WHERE OrderID = 10252;
DELETE FROM dbo."Order Details" WHERE OrderID = 10252;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() as ErrorNumber,
ERROR_MESSAGE() as ErrorMessage;
IF (XACT_STATE()) = -1
BEGIN
N'The transaction is in an uncommittable state. ' +
'Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
-- Test if the transaction is active and valid.
IF (XACT_STATE()) = 1
BEGIN
N'The transaction is committable. ' +
'Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH
GO
上面主要讲述了如何定义事务的边界(即开始,结束),SQL Server 2005中事务的模式以及事务中的错误处理。
参考资料:ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/udb9/html/0cbd323b-60e1-4aab-824d-129d266c0a74.htm