トランザクション制御
MySQL は、SET AUTOCOMMIT、START TRANSACTION、COMMIT、ROLLBACK などのステートメントを通じてローカル トランザクションをサポートします。
構文:
START TRANSACTION | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET AUTOCOMTIT = {0 | 1}
デフォルトでは、MySQL は自動コミットします。明示的なコミットとロールバックを使用してトランザクションを開始する必要があります。これは、Oracle のトランザクション管理コマンドと連携して行われます。明らかな違いは、アプリケーションを Oracle データベースから MySQL データベースに移行する場合、アプリケーション内でトランザクションが明確に管理されていることを確認する必要があることです。
START TRANSACTION または BEGIN ステートメントは、新しいトランザクションを開始できます。
COMMIT と ROLLBACK は、トランザクションをコミットまたはロールバックするために使用されます。
CHAIN 句と RELEASE 句は、それぞれトランザクションの送信またはロールバック後の操作を定義するために使用され、チェーンはすぐに新しいものを開始し、前のトランザクションと同じ分離レベルでクライアントから切断されます。
SET AUTOCOMMIT は現在の接続の送信方法を変更できます。SET AUTOCOMMIT=0 が設定されている場合、設定後のすべてのトランザクションは明示的なコマンドによって送信またはロールバックする必要があります。
特定のステートメントに対してのみトランザクション制御が必要な場合は、START TRANSACTION を使用してトランザクションを開始する方が便利です。これにより、トランザクション終了後に自動的に自動送信メソッドに戻ることができます。この場合、AUTOCOMMIT を変更してトランザクションを制御すると、各トランザクションの開始時に START TRANSACTION を実行する必要がなくなり、より便利になります。
したがって、同じトランザクション内で異なるストレージ エンジンのテーブルを使用しないことをお勧めします。それ以外の場合、コミットとロールバックはトランザクション タイプのテーブルのみをコミットおよびロールバックできるため、ロールバック中に非トランザクション タイプのテーブルの特別な処理が必要になります。
通常、コミットされたトランザクションのみがバイナリ ログに記録されますが、トランザクションに非トランザクション テーブルが含まれる場合、非トランザクション テーブルの更新を確実にコピーできるようにするために、ロールバック操作もバイナリ ログに記録されます。スレーブデータベース。
Oracle のトランザクション管理と同様に、すべての DDL ステートメントをロールバックすることはできず、一部の DDL ステートメントは暗黙的な送信を引き起こします。
トランザクションでは、セーブポイントを定義することでロールバックするトランザクションの一部を指定できますが、コミットするトランザクションの一部を指定することはできません。複雑なアプリケーションの場合、複数の異なるセーブポイントを定義でき、異なる条件が満たされた場合に異なるセーブポイントをロールバックできます。同名のセーブポイントが定義されている場合、後から定義したセーブポイントによって以前の定義が上書きされることに注意してください。 不要になったセーブポイントについては、release savepoint コマンドを使用してセーブポイントを削除できます。セーブポイントを削除した後は、rollback to savepoint コマンドを実行できなくなります。
以下の例は、ロールバックする必要があるトランザクションの場所を指定するセーブポイントを定義することによる、ロールバック トランザクションのシミュレーションの一部です。