sql server 中的某个嵌套事务可否独立于外层事务提交?而不被外层事务回滚?
如下:能否事务B不回滚?请高手赐教。
----------事务A开始-------------
....
[----------事务B开始------------]
....操作
[----------事务B提交------------]....错误
----------事务A回滚-------------

解决方案 »

  1.   


    begin tran  --事务1
    --SQL
    save transaction a
    begin tran  --事务2
    --SQL
    commit tran
    rollback transaction a
    --SQL
    commit tran
      

  2.   

    ----------事务A开始-------------
    ....
    [----------事务B开始------------]
    ....操作
    [----------事务B提交------------]
    <在这个加入以下代码段1>
    ....错误
    <在这个加入以下代码段2>
    ----------事务A回滚--------------------------------------------------------------
    代码段1:
    设回滚点A1,
    判断IsErr1,是错误回滚过来的,这里就提交事务2不走后面了。不是就正常走。代码段2:
    如果出错,给一个全局变量IsErr1赋值True。回滚时回滚到回滚点A1.--------------------------------------------------
    但这种跳来跳去的代码要小心。
      

  3.   


    create table demo(name varchar(10) primary key,val varchar(20))
    gobegin transaction
    insert into demo values('BB','B term')
    save transaction A
    insert into demo values('BB','B term')
    rollback TRANSACTION Aselect * from demodrop table demo/***********消息 2627,级别 14,状态 1,第 5 行
    违反了 PRIMARY KEY 约束 'PK__demo__76AC771E'。不能在对象 'dbo.demo' 中插入重复键。
    语句已终止。
    name       val
    ---------- --------------------
    BB         B term(1 行受影响)
    没有保存点的create table demo(name varchar(10) primary key,val varchar(20))
    gobegin transaction
    insert into demo values('BB','B term')
    --save transaction A
    insert into demo values('BB','B term')
    rollback TRANSACTIONselect * from demodrop table demo/************消息 2627,级别 14,状态 1,第 5 行
    违反了 PRIMARY KEY 约束 'PK__demo__7A7D0802'。不能在对象 'dbo.demo' 中插入重复键。
    语句已终止。
    name       val
    ---------- --------------------(0 行受影响)
      

  4.   

    IF OBJECT_ID('TEMPDB..#T') IS NOT NULL DROP TABLE #T
    GO
    CREATE TABLE #T(COL1 INT)
    GO
    BEGIN TRAN
    INSERT INTO #T
    SELECT 1

    BEGIN TRAN
    INSERT INTO #T
    SELECT 2
    --这里的提交没鸟用,会被下面的ROLLBACK效果覆盖
    COMMIT TRAN INSERT INTO #T
    SELECT 3
    ROLLBACK TRAN
    SELECT * FROM #T
    GO
    TRUNCATE TABLE #T
    GO
    BEGIN TRAN
    INSERT INTO #T
    SELECT 1

    BEGIN TRAN
    INSERT INTO #T
    SELECT 2
    --这里的ROLLBACK就直接把两个事务都回滚了,下面的COMMIT会报错
    ROLLBACK TRAN INSERT INTO #T
    SELECT 3
    COMMIT TRAN
    SELECT * FROM #T
      

  5.   

    另外,MSSQL的事务名称就是个摆设,没鸟用