none
sqlserver automatically closes open transaction on error RRS feed

  • Frage

  • Hallo NG,

    folgendes Szenario:

    create table test (dummy integer)
    go

     
    SET IMPLICIT_TRANSACTIONS ON
    go
     
    BEGIN TRAN
    go
     
    insert into test values ('1')
    go
     
    insert into test values ('2')
    go
     
    insert into test values ('X')
    go
    --> produces error and obviously rollback the transaction
    --> but we want to ignore this row
     
    insert into test values ('4')
    go
     
    COMMIT TRAN
    go
     
    SET IMPLICIT_TRANSACTIONS OFF
    go
     
    select * from test
    go
    -- we expect 3 rows (1,2,4), but we get only on row (4)
     
    drop table test
    go
    wer kann mir hier weiterhelfen?
    Danke und Gruss Olaf Thon
    Donnerstag, 27. Januar 2011 08:52

Antworten

  • hallo Olaf,

    ist eigentlich ganz einfach. Das Verhalten erklärt sich von selber. Setze in jeder Zeile nach einem GO einfach ein PRINT @@trancount; ein.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 27. Januar 2011 09:01
    Moderator
  • wer kann mir hier weiterhelfen?
    Danke und Gruss Olaf Thon


    Hallo Olaf,

    1. Insert '1' startet die erste implizite Transaction.
    2. Insert '2' wird in der ersten Transaction ausgeführt.
    3. Insert 'X' wird in der ersten Transaction ausgeführt.
      Insert 'X' schlägt fehl, weil 'X' in int nicht umgewandelt werden kann.
      Die erste Transaction wird mit Rollback beendet, alle Datenänderungen werden zurückgerollt.
    4. Insert '4' startet die zweite implizite Transaction.
    5. Commit macht alle Datenäderungen der zweiten impliziten Transaction permanent.

    SET IMPLICIT_TRANSACTIONS (Transact-SQL)


    Gruß Yury
    Donnerstag, 27. Januar 2011 12:30

Alle Antworten

  • hallo Olaf,

    ist eigentlich ganz einfach. Das Verhalten erklärt sich von selber. Setze in jeder Zeile nach einem GO einfach ein PRINT @@trancount; ein.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 27. Januar 2011 09:01
    Moderator
  • wer kann mir hier weiterhelfen?
    Danke und Gruss Olaf Thon


    Hallo Olaf,

    1. Insert '1' startet die erste implizite Transaction.
    2. Insert '2' wird in der ersten Transaction ausgeführt.
    3. Insert 'X' wird in der ersten Transaction ausgeführt.
      Insert 'X' schlägt fehl, weil 'X' in int nicht umgewandelt werden kann.
      Die erste Transaction wird mit Rollback beendet, alle Datenänderungen werden zurückgerollt.
    4. Insert '4' startet die zweite implizite Transaction.
    5. Commit macht alle Datenäderungen der zweiten impliziten Transaction permanent.

    SET IMPLICIT_TRANSACTIONS (Transact-SQL)


    Gruß Yury
    Donnerstag, 27. Januar 2011 12:30