ですから、あまり具体的には言えませんが、私がお伝えできることは、これを理解するのに十分だと思います. まず、gorp を使用してセットアップを行い、トランザクションを取得します。github.com/denisenkom/go-mssqldb
ドライバーを使用しています。
次に、一連の操作を実行し、それらが失敗した場合は I rollback
、すべてが成功した場合は I commit
. 問題は、失敗したステートメントのみがロールバックされ、残りの操作はロールバックされないことです。これがうまくいくはずの方法ではないというのは間違っていますか?
ここに、私が話していることをよりよく理解するための大まかな疑似コードを示します。
trans,err := dbmap.Begin()
//assume all errors are received and checked before continuing
id := trans.Exec("insert thing") //successful, persists after rollback
thing := trans.Select("Select thing") //successful
trans.Exec("update other_thing with thing") //successful, persists after rollback
newthing := trans.Exec("insert new_thing with thing") //fails, rollsback
if err != nil{
trans.Rollback() //No errors
return
}
trans.Commit()
rollback
それ以来、すべてがそうであるべきだと私は間違っていdbmap.Begin()
ますか?これはドライバー実装のバグですか? すべてのヘルプは大歓迎です。ありがとう!
アップデート
https://play.golang.org/p/0L3Vgk8C_Fをテストしたところうまくいきました。これはすぐに本番環境になるため、安定性が重要であるため、v1 ブランチを使用しています。摘んでみますが、軽く巻いているだけのようです。