none
Insert及Commit Tran問題 RRS feed

  • 問題

  • 使用Begin Tran及Commit Tran時,內裡的所有insert動作,都要等Comit Tran執行時,才會寫到Table上。

    請問有沒有一種語法,令Insert的資料,就算Rollback仍然可寫入Table?

    例如我Insert dbo.a => insert dbo.b => insert dbo.c,但insert dbo.c時deadlock,要rollback,但我希望dbo.b insert了的資料可以保留,不用rollback,請問有方法嗎?

    不好意思,這可能和SQL管理無關…

    2013年3月5日 上午 06:43

解答

  • 或許你可以利用 SAVE TRANSACTION來註記要回到哪一個動作之後,不過並非所有的錯誤發生都可以回到SAVE POINT。

    我是利用下列的T-SQL嘗試模擬你的問題,你可能需要依照你的情境做調整。

    use tempdb
    go
    
    
    create table a (c1 int)
    create table b (c1 int)
    create table c (c1 int)
    go
    
    begin tran 
    
    insert into a values(1)
    save tran s1
    
    insert into b values(2)
    save tran s2
    
    begin try
    	RAISERROR ('這是故意引發錯誤',16,1)
    end try
    begin catch
    	rollback tran s2
    end catch
    
    commit tran
    go
    
    select *
    from a
    
    select *
    from b
    
    select *
    from c
    go
    
    drop table a
    drop table b
    drop table c
    go
    


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2013年3月5日 上午 08:46
    版主

所有回覆

  • 或許你可以利用 SAVE TRANSACTION來註記要回到哪一個動作之後,不過並非所有的錯誤發生都可以回到SAVE POINT。

    我是利用下列的T-SQL嘗試模擬你的問題,你可能需要依照你的情境做調整。

    use tempdb
    go
    
    
    create table a (c1 int)
    create table b (c1 int)
    create table c (c1 int)
    go
    
    begin tran 
    
    insert into a values(1)
    save tran s1
    
    insert into b values(2)
    save tran s2
    
    begin try
    	RAISERROR ('這是故意引發錯誤',16,1)
    end try
    begin catch
    	rollback tran s2
    end catch
    
    commit tran
    go
    
    select *
    from a
    
    select *
    from b
    
    select *
    from c
    go
    
    drop table a
    drop table b
    drop table c
    go
    


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2013年3月5日 上午 08:46
    版主
  • 如果我是使用SQL 2000,當遇到Deadlock,SQL會自動rollback,是不是不能用Catch和Rollback Tran?

    2013年3月8日 上午 02:31
  • Sql2k doesn't have try ... catch.
    2013年3月8日 上午 03:24