3

1 つの複数行の INSERT ステートメント (300 程度の値のセット) があり、それをオール オア ナッシング方式で MySQL データベースにコミットしたいと考えています。

insert into table VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9);

場合によっては、コマンド内の一連の値がテーブルの基準を満たさないことがあります (重複キーなど)。その場合、以前のセットをデータベースに追加したくありません。これを次のコードで実装しましたが、ロールバック コマンドは違いを生んでいないようです。私はこのドキュメントを使用しました: http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html

Dim transaction As MySqlTransaction = sqlConnection.BeginTransaction()
sqlCommand = New MySqlCommand(insertStr, sqlConnection, transaction)
Try
    sqlCommand.ExecuteNonQuery()
Catch ex As Exception
    writeToLog("EXCEPTION: " & ex.Message & vbNewLine)
    writeToLog("Could not execute " & sqlCmd & vbNewLine)
    Try
        transaction.Rollback()
        writeToLog("All statements were rolled back." & vbNewLine)
        Return False
    Catch rollbackEx As Exception
        writeToLog("EXCEPTION: " & rollbackEx.Message & vbNewLine)
        writeToLog("All statements were not rolled back." & vbNewLine)
        Return False
    End Try
End Try
transaction.commit()

DUPLICATE KEY 例外がスローされ、Rollback Exception はスローされず、重複キーまでのすべての値のセットがデータベースにコミットされます。私は何を間違っていますか?

4

1 に答える 1

3

MyISAM テーブル (デフォルト) を使用していますか? MyISAM はトランザクションをサポートしていません。トランザクションが必要な場合はInnoDBテーブルを使用してください。

于 2010-04-20T01:10:57.307 に答える