0

このリンクを参照してhttp://msdn.microsoft.com/en-us/library/ms947432.aspx

Microsoft のサイトに掲載されているので動作すると思われるサンプルコードです。

&& Start a VFP transaction and a transaction on the server.
Begin Transaction  && FoxPro Start Trans Command

=SQLExec(nConnection, 'BEGIN TRANSACTION')  && SQL Start Trans Commnad

&& Update changes to MyTable.    
lEverythingOK = TableUpdate( 2, .F., 'rv_MyView' )

If lEverythingOK
 && Update changes to MyOtherTable.
 lEverythingOK = tableupdate( 2,.F.,'rv_MyOtherView')
EndIf

&& End the transaction on the server and VFP.

If lEverythingOK
 =SQLExec(nConnection, 'COMMIT')   && SQL COMMIT COMMAND
 End Transaction                   && Foxpro COMMIT COMMAND 
Else
 =SQLExec( nConnection, 'ROLLBACK' )  && SQL ROLLBACK COMMAND
 RollBack                             && FoxPro ROLLBACK COMMAND
EndIf

このサンプルは、リモート ビューを使用する MS SQL および Foxpro に基づいています。Remote View を使用して MYSQL と Foxpro を使用してこれを再現したかったのです。問題は、TableUpdate コマンドを発行すると、=SQLExec( nConnection, 'COMMIT' ) コマンドをまだ発行していなくても、レコードが MYSQL サーバーにコミットされることです。INNODBエンジンを使用しています。Pls TableUpdate コマンドを省略すると、MYSQL からトランザクションを COMMIT または ROLLBACK できることに注意してください。コマンド TableUpdate を削除してレコードのエラーをトラップしないようにしたかったので、MYSQLサーバーにコミットする前にレコードごとにエラーレコードをチェックする必要がありませんでした。

ありがとう。

4

2 に答える 2

0

この例では、FoxPro データに変更を加えていないため、ローカル トランザクション処理は必要ありません。これを追加したのは、同じトランザクション内でローカル データの更新を行っているからではなく、「役立つかもしれない」と考えているからです。それは問題を解決するかもしれません。

とにかく同じトランザクション内でローカルの変更を行っている場合は、リモート クエリが完了した後にローカルの変更を行う必要があるため、とにかくその設計を再検討する必要があります。

それでも問題が解決しない場合、質問には「レコード」がコミットされると書かれていますが、例では 2 つのリモート ビューを更新しています。コードは 1 つだけで機能しますか? そうでない場合、両方とも更新されていますか? 最初にロールバックするとどうなりますか? ビューではなくテーブルに対して作業している場合はどうですか? 変更をまったくロールバックできませんか?

最小限の再現可能なサンプルを思いつくことができれば、答え (または解決策) を得る可能性ははるかに高くなります。

于 2012-08-27T22:25:47.457 に答える
0

自動コミットを使用してみてください:

自動コミットを設定=0

MySQl ドキュメントから:

autocommit 変数をゼロに設定して自動コミット モードを無効にした後、トランザクション セーフ テーブル (InnoDB、BDB、または NDBCLUSTER のテーブルなど) への変更は、すぐには永続化されません。COMMIT を使用して変更をディスクに保存するか、ROLLBACK を使用して変更を無視する必要があります。

于 2013-02-06T03:54:32.867 に答える