11

ですから、あまり具体的には言えませんが、私がお伝えできることは、これを理解するのに十分だと思います. まず、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 ブランチを使用しています。摘んでみますが、軽く巻いているだけのようです。

4

2 に答える 2

2

自動コミットが有効になっていないことを確認してください。多くのコマンド ライン ツール、UI、さらにはドライバーでさえ、デフォルトで有効になっています

于 2015-10-13T06:57:15.487 に答える
0

これによると(数行だけ読んだ)https://technet.microsoft.com/en-us/library/ms187878(v=sql.105).aspx

自動コミットはデフォルトでオンになっているようです。これにより、go-mssqldb の作成者がこの機能のオン/オフを実装していない場合、オンになっているという結論に至ります。

SET IMPLICIT_TRANSACTIONS を検索するだけで、自分で切り替えることができます

于 2015-10-13T16:11:53.447 に答える