2017-06-28 7 views
-1

// Aktualisieren der CloseJira Status in der DatenbankWie einige Operationen auf Transaktionsrollbacks

Problemstellung hinzuzufügen.

func CloseJira(qMonName string) { 
tx, err := dbCon.Begin() 
notifier.CheckErr(err, "CloseJira() -> tx -> dbCon.Begin()", dbErrLog) 
defer tx.Rollback() 

stmt, errDBPrepare := tx.Prepare("update TABLE1 set 
Key=NULL, StatusKey='Closed', Statustime_UTC=? where Name=?") 
//Update db table record 
notifier.CheckErr(errDBPrepare, "updateCloseJira() -> dbCon.Prepare()", 
dbErrLog) 
defer stmt.Close() // danger! 

res, errStmtExec := stmt.Exec(time.Now().UTC(), qMonName) 
notifier.CheckErr(errStmtExec, "CloseJira() -> stmt.Exec()", dbErrLog) 

err = tx.Commit() 
notifier.CheckErr(err, "CloseJira() -> err -> tx.Commit()", dbErrLog) 

_, errRowAffected := res.RowsAffected() 
notifier.CheckErr(errRowAffected, "CloseJira() -> res.RowsAffected()", 
dbErrLog) 
} 

Antwort

0

Hier ist Muster, das ich häufig verwenden, wenn ich eine Transaktion benötigen:

func Foo() (err error) { 
    var tx *sql.Tx 
    tx, err = db.Begin() 
    if err != nil { 
     return err 
    } 
    defer func() { 
     if err == nil { 
      tx.Commit() 
     } else { 
      tx.Rollback() 
     } 
    }() 
    // Do whatever you want here. 
} 

Der Trick besteht darin, dass hier die latente Funktion wird immer am Ende laufen. Wenn Ihre Funktion mit einem Fehler zurückkehrt, können Sie sie abrufen und zurücksetzen (und die andere gewünschte Aktion ausführen). Wenn die Funktion normal zurückgegeben wird, können Sie die Transaktion festschreiben.

Verwandte Themen