• SQL Server 2005之控制事务


    控制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 TRANSACTIONCOMMIT TRANSACTIONCOMMIT WORKROLLBACK TRANSACTIONROLLBACK 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
  • 相关阅读:
    MyBatis笔记:xml映射文件
    MyBatis笔记:xml配置文件
    JSP获取当前系统时间并显示
    使用<jsp:forward>和<jsp:param>
    JSP简单总结
    网页版学生管理系统简易版DOM
    当为servlet配置时出现servlet标签报错
    给js的事件驱动函数添加快捷键
    js的表格对象和DOM联合操作
    Centos7安装Greenplum5.3单机版教程
  • 原文地址:https://www.cnblogs.com/itboyblog/p/2233144.html
Copyright © 2020-2023  润新知