【Java】MySQLトランザクション入門解析
3570 ワード
MySQLトランザクション
事務とは何ですか.
MySQLトランザクションは、主に操作量が多く、複雑度の高いデータの処理に使用されます.たとえば、人員管理システムでは、人員を削除するには、人員の基本資料を削除するだけでなく、ポスト、文章などの人員に関する情報を削除する必要があります.これにより、これらのデータベース操作文はトランザクションを構成します. MySQLでは、Innodbデータベースエンジンを使用しているデータベースまたはテーブルのみがトランザクション をサポートします.トランザクションは、データベースの整合性を維持し、一括SQL文がすべて実行されるか、 がすべて実行されないかを保証するために使用できます.トランザクションはinsert,update,delete文 を管理するために使用されます.
MySQLコマンドラインのデフォルト設定では、トランザクションは自動的にコミットされます.つまり、SQL文を実行するとすぐにCOMMIT操作が実行されます.したがって、トランザクションを明示的に開くには、コマンド
トランザクションの4つの特性(トランザクションが満たすべき4つの条件)
原子間トランザクション(transaction)のすべての操作は、すべて完了するか、すべて完了しないかで、中間の一環では終了しません.トランザクションは実行中にエラーが発生し、トランザクションが実行される前の状態にロールバックされます.このトランザクションが実行されたことがないように.
一貫性トランザクションの開始前とトランザクションの終了後、データベースの整合性は破壊されません.
独立性データベースでは、複数の同時トランザクションがデータの読み書きと変更を同時に行うことができます.独立性により、複数のトランザクションが同時実行されるときにクロス実行によるデータの不一致を防止できます.
永続トランザクションが終了すると、システム障害が発生してもデータの変更は永続的に行われます.
トランザクションが同時に発生する3つの問題!(コンシステンシの問題を読みます!)
ダーティリードダーティリードは、あるトランザクションAが別のトランザクションBによって変更されたが、まだコミットされていないデータを読み取った場合に発生する.Bがロールバックした場合、トランザクションAは無効なデータを読み出します.これは再読み込み不可と似ていますが、2番目のトランザクションではコミットを実行する必要はありません.
重複不可読み出しロックベースの並列制御方法では、select実行時にリードロックを追加しないと重複不可読み出しの問題が発生します.マルチバージョンパラレル制御メカニズムでは、コミット競合に遭遇したトランザクションがロールバックされ、解放される必要がある場合、重複しない読み取りの問題が発生します.
幻読み幻読みは、2つのまったく同じクエリーが実行されると、2回目のクエリーで返される結果セットが1つ目のクエリーと異なる場合に発生します.
トランザクションの4つの独立性レベル
Read Uncommitted(コミットなし)
Read Committed(コミット済み):ダーティリードの解決
Reparetable Read(繰り返し可能):汚れた読み取りを解決し、繰り返し不可能
Serializable(シリアル化):トランザクションが同時に発生するすべての問題を解決
トランザクション制御文 BEGINまたはSTART TRANSACTIONは、トランザクション を明示的に開く COMMITはCOMMIT WORKも使えますが、両者は等価です.COMMITはトランザクションをコミットし、データベースに対するすべての変更を永続的な にします. ROLLBACKはROLLBACK WORKも使えますが、両者は等価です.ロールバックは、ユーザーのトランザクションを終了し、実行中の を取り消します. SAVEPOINT identifier、SAVEPOINTはトランザクションに1つの保存ポイントを作成することを許可し、1つのトランザクションに複数のSAVEPOINTがあることができる. RELEASE SAVEPOINT identifierトランザクションのセーブポイントを削除します.指定されたセーブポイントがない場合、この文を実行すると、例外 が投げ出されます. ROLLBACK TO identifierはトランザクションをタグポイント にロールバックする SET TRANSACTIONトランザクションの独立性レベルを設定するための MYSQLトランザクションには主に2つの方法があります
1、BEGIN、ROLLBACK、COMMITで実現 BEGINトランザクション を開始 ROLLBACKトランザクションロールバック COMMIT事務確認 2、直接SETでMySQLの自動提出モードを変える SET AUTOMMIT=0自動提出禁止 SET AUTOMMIT=1オートコミット をオン
トランザクションテスト
事務とは何ですか.
MySQLトランザクションは、主に操作量が多く、複雑度の高いデータの処理に使用されます.たとえば、人員管理システムでは、人員を削除するには、人員の基本資料を削除するだけでなく、ポスト、文章などの人員に関する情報を削除する必要があります.これにより、これらのデータベース操作文はトランザクションを構成します.
MySQLコマンドラインのデフォルト設定では、トランザクションは自動的にコミットされます.つまり、SQL文を実行するとすぐにCOMMIT操作が実行されます.したがって、トランザクションを明示的に開くには、コマンド
BEGIN
またはSTART TRANSACTION
を使用するか、または現在のセッションの自動コミットを使用するためのコマンドSET AUTOCOMMIT=0
を実行する必要があります.トランザクションの4つの特性(トランザクションが満たすべき4つの条件)
原子間トランザクション(transaction)のすべての操作は、すべて完了するか、すべて完了しないかで、中間の一環では終了しません.トランザクションは実行中にエラーが発生し、トランザクションが実行される前の状態にロールバックされます.このトランザクションが実行されたことがないように.
一貫性トランザクションの開始前とトランザクションの終了後、データベースの整合性は破壊されません.
独立性データベースでは、複数の同時トランザクションがデータの読み書きと変更を同時に行うことができます.独立性により、複数のトランザクションが同時実行されるときにクロス実行によるデータの不一致を防止できます.
永続トランザクションが終了すると、システム障害が発生してもデータの変更は永続的に行われます.
トランザクションが同時に発生する3つの問題!(コンシステンシの問題を読みます!)
ダーティリードダーティリードは、あるトランザクションAが別のトランザクションBによって変更されたが、まだコミットされていないデータを読み取った場合に発生する.Bがロールバックした場合、トランザクションAは無効なデータを読み出します.これは再読み込み不可と似ていますが、2番目のトランザクションではコミットを実行する必要はありません.
重複不可読み出しロックベースの並列制御方法では、select実行時にリードロックを追加しないと重複不可読み出しの問題が発生します.マルチバージョンパラレル制御メカニズムでは、コミット競合に遭遇したトランザクションがロールバックされ、解放される必要がある場合、重複しない読み取りの問題が発生します.
幻読み幻読みは、2つのまったく同じクエリーが実行されると、2回目のクエリーで返される結果セットが1つ目のクエリーと異なる場合に発生します.
トランザクションの4つの独立性レベル
Read Uncommitted(コミットなし)
Read Committed(コミット済み):ダーティリードの解決
Reparetable Read(繰り返し可能):汚れた読み取りを解決し、繰り返し不可能
Serializable(シリアル化):トランザクションが同時に発生するすべての問題を解決
トランザクション制御文
1、BEGIN、ROLLBACK、COMMITで実現
トランザクションテスト
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; #
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; #
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; #
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; #
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; #
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; #
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>