在程序中若更新成功,则一起commit否则rollback

解决方案 »

  1.   


     Transact-SQL 参考  
    BEGIN TRANSACTION
    标记一个显式本地事务的起始点。BEGIN TRANSACTION将 @@TRANCOUNT 加 1。语法
    BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
        [ WITH MARK [ 'description' ] ] ]参数
    transaction_name是给事务分配的名称。transaction_name 必须遵循标识符规则,但是不允许标识符多于 32 个字符。仅在嵌套的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 语句的最外语句对上使用事务名。@tran_name_variable是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。WITH MARK ['description']指定在日志中标记事务。Description 是描述该标记的字符串。如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记。注释
    BEGIN TRANSACTION 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。BEGIN TRANSACTION 为使用本语句的连接启动一个本地事务。根据当前事务隔离级别的设置情况,为支持该连接所发出的 Transact-SQL 语句而获取的许多资源被该事务锁定,直到此事务以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成。长时间处于等待处理状态的事务会阻止其他用户访问锁定的资源。虽然 BEGIN TRANSACTION 启动一个本地事务,但是在应用程序接下来执行了一个必须记录的操作(如执行 INSERT、UPDATE 或 DELETE 语句)之前,它并不被记录在事务日志中。应用程序能执行一些操作,例如为了保护 SELECT 语句的事务隔离级别而获取锁,但是直到应用程序执行一个修改操作日志中才有记录。在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个(最外部的)事务名。回滚到其它任何名字(有效的保存点名除外)都会产生错误。事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这些语句仅当外层的事务回滚时才会进行回滚。BEGIN TRANSACTION 启动一个本地事务。如果在事务提交或回滚之前执行了如下操作,本地事务将升级到分布式事务: 执行了一个 INSERT、DELETE 或 UPDATE 语句,该语句引用了连接的服务器上的一个远程表。如果用于访问连接服务器的 OLE DB 提供程序不支持 ItransactionJoin 接口,该 INSERT、UPDATE 或 DELETE 语句则会失败。
    当启用了 REMOTE_PROC_TRANSACTIONS 选项时,将调用远程存储过程。 
    SQL Server 的本地复本成为事务控制器并且使用 MS DTC 来管理该分布式事务。标记事务
    WITH MARK 选项使事务名置于事务日志中。将数据库还原到早期状态时,可使用标记事务替代日期和时间。有关更多信息,请参见将数据库还原到前一个状态、恢复到命名事务和 RESTORE。另外,若要将一组相关数据库恢复到逻辑上一致的状态,必须使用事务日志标记。标记可由分布式事务置于相关数据库的事务日志中。将这组相关数据库恢复到这些标记将产生一组在事务上一致的数据库。在相关数据库中放置标记需要特殊的过程。有关更多信息,请参见"相关数据库的备份和恢复"。只有当数据库由标记事务更新时,才在事务日志中放置标记。不修改数据的事务不被标记。在已存在的未标记事务中可以嵌套 BEGIN TRAN new_name WITH MARK。嵌套后,new_name 便成为事务的标记名,不论是否已为事务提供了该名称。在下例中,M2 是标记名。BEGIN TRAN T1
    UPDATE table1 ...
    BEGIN TRAN M2 WITH MARK
    UPDATE table2 ...
    SELECT * from table1
    COMMIT TRAN M2
    UPDATE table3 ...
    COMMIT TRAN T1
    尝试标记已标记的事务将产生警告(非错误)消息:BEGIN TRAN T1 WITH MARK
    UPDATE table1 ...
    BEGIN TRAN M2 WITH MARKServer: Msg 3920, Level 16, State 1, Line 3
    WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
    The option is ignored.权限
    任何有效的用户都具有默认的 BEGIN TRANSACTION 权限。示例
    A. 命名事务下例说明如何命名事务。提交命名事务后,为所有畅销计算机书籍支付的版税增加 10%。DECLARE @TranName VARCHAR(20)
    SELECT @TranName = 'MyTransaction'BEGIN TRANSACTION @TranName
    GO
    USE pubs
    GO
    UPDATE roysched
    SET royalty = royalty * 1.10
    WHERE title_id LIKE 'Pc%'
    GOCOMMIT TRANSACTION MyTransaction
    GOB. 标记事务下例说明如何标记事务。标记名为"RoyaltyUpdate"的事务。BEGIN TRANSACTION RoyaltyUpdate 
       WITH MARK 'Update royalty values'
    GO
    USE pubs
    GO
    UPDATE roysched
       SET royalty = royalty * 1.10
       WHERE title_id LIKE 'Pc%'
    GO
    COMMIT TRANSACTION RoyaltyUpdate
    GO
    请参见BEGIN DISTRIBUTED TRANSACTIONCOMMIT TRANSACTIONCOMMIT WORKRESTORE恢复到命名事务ROLLBACK TRANSACTION ROLLBACK WORKSAVE TRANSACTION事务©1988-2000 Microsoft Corporation。保留所有权利。
      

  2.   

    SAVE TRANSACTION
    在事务内设置保存点。语法
    SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }参数
    savepoint_name是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。@savepoint_variable是用户定义的、含有有效保存点名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。注释
    用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所有语句和过程。在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION。重要  当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。
    权限
    默认情况下,将 SAVE TRANSACTION 权限授予任何有效用户。示例
    下例更改分给 The Gourmet Microwave 的两位作者的版税。数据库将会在两个更新间不一致,因此必须将它们分组为用户定义的事务。BEGIN TRANSACTION royaltychange
       UPDATE titleauthor
          SET royaltyper = 65
             FROM titleauthor, titles
                WHERE royaltyper = 75
                   AND titleauthor.title_id = titles.title_id
                   AND title = 'The Gourmet Microwave'
       UPDATE titleauthor
          SET royaltyper = 35
             FROM titleauthor, titles
                WHERE royaltyper = 25
                   AND titleauthor.title_id = titles.title_id
                   AND title = 'The Gourmet Microwave'
    SAVE TRANSACTION percentchanged/* 
    After having updated the royaltyper entries for the two authors, the 
    user inserts the savepoint percentchanged, and then determines how a 
    10-percent increase in the book's price would affect the authors' royalty earnings. 
    */UPDATE titles
       SET price = price * 1.1
          WHERE title = 'The Gourmet Microwave'
    SELECT (price * royalty * ytd_sales) * royaltyper
       FROM titles, titleauthor
          WHERE title = 'The Gourmet Microwave'
             AND titles.title_id = titleauthor.title_id
    /* 
    The transaction is rolled back to the savepoint
    with the ROLLBACK TRANSACTION statement. 
    */ROLLBACK TRANSACTION percentchanged
    COMMIT TRANSACTION/* End of royaltychange. */
      

  3.   

    SAVE TRANSACTION
    在事务内设置保存点。语法
    SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }参数
    savepoint_name是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。@savepoint_variable是用户定义的、含有有效保存点名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。注释
    用户可以在事务内设置保存点或标记。保存点定义如果有条件地取消事务的一部分,事务可以返回的位置。如果将事务回滚到保存点,则必须(如果需要,使用更多的 Transact-SQL 语句和 COMMIT TRANSACTION 语句)继续完成事务,或者必须(通过将事务回滚到其起始点)完全取消事务。若要取消整个事务,请使用 ROLLBACK TRANSACTION transaction_name 格式。这将撤消事务的所有语句和过程。在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION。重要  当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。
    权限
    默认情况下,将 SAVE TRANSACTION 权限授予任何有效用户。示例
    下例更改分给 The Gourmet Microwave 的两位作者的版税。数据库将会在两个更新间不一致,因此必须将它们分组为用户定义的事务。BEGIN TRANSACTION royaltychange
       UPDATE titleauthor
          SET royaltyper = 65
             FROM titleauthor, titles
                WHERE royaltyper = 75
                   AND titleauthor.title_id = titles.title_id
                   AND title = 'The Gourmet Microwave'
       UPDATE titleauthor
          SET royaltyper = 35
             FROM titleauthor, titles
                WHERE royaltyper = 25
                   AND titleauthor.title_id = titles.title_id
                   AND title = 'The Gourmet Microwave'
    SAVE TRANSACTION percentchanged/* 
    After having updated the royaltyper entries for the two authors, the 
    user inserts the savepoint percentchanged, and then determines how a 
    10-percent increase in the book's price would affect the authors' royalty earnings. 
    */UPDATE titles
       SET price = price * 1.1
          WHERE title = 'The Gourmet Microwave'
    SELECT (price * royalty * ytd_sales) * royaltyper
       FROM titles, titleauthor
          WHERE title = 'The Gourmet Microwave'
             AND titles.title_id = titleauthor.title_id
    /* 
    The transaction is rolled back to the savepoint
    with the ROLLBACK TRANSACTION statement. 
    */ROLLBACK TRANSACTION percentchanged
    COMMIT TRANSACTION/* End of royaltychange. */
      

  4.   

    举例:create table Table1 (a int)
    go
    begin tran xx
      insert table1 values(99)
    save tran xx
      insert table1 values(1)
    rollback tran xx
    commit tran xxselect * from  table1
      

  5.   

    举例:create table Table1 (a int)
    go
    begin tran xx
      insert table1 values(99)
    save tran xx
      insert table1 values(1)
    rollback tran xx
    commit tran xxselect * from  table1
      

  6.   

    谢谢大力,是不是只有SAVE TRANSACTION 这个方法了?
    这个方法好像还是差一点
    而且其他DBMS好像没有这个功能这个问题我原来觉得是不能直接用事务实现的,所以才拿到这来看看高手们是怎么解决这个问题的
    thanks!