Mysql事務及び4つの隔離レベル例
ブログを参照してください:http://www.runoob.com/mysql/mysql-transaction.html
まとめを見てから文章を読むほうがいいです.
MySQLの事務
***サポートは、MySQLサーバ自体にバインドされているのではなく、記憶エンジンと関連している1.MyISAM:事務をサポートしていない.読み取り専用プログラムの性能向上のために使用される.2.InnoDB:ACID事務、行レベルロック、同時3.Berkeley DB:事務対応
一つの事務は連続的なデータベース操作で、まるで単一の作業ユニットで行われているようです.言い換えれば、グループ内の個々の動作が成功しない限り、完全な事務ではない.事務の操作が失敗すると、事務全体が失敗します.
実際には、クラブの多くのSQLがあるグループに照会し、実行するすべての人が一緒に事務の一部として働きます.
事務の特性:事務には以下の四つの標準属性の略語ACIDがあり、通常は以下のように呼ばれています.
原子性:作業ユニット内のすべての操作が完了することを確認します.そうでないと、問題は故障点で中止され、以前の操作が前の状態に戻ることになります.
整合性:データベースが正確に状態を変えた後、提出された事務を確保する.
隔離性:事務操作を相互に独立し、透明にする.
耐久性:提出されたトランザクションの結果や効果を確保するシステムが故障した場合もあります.
事物制御語句:BEGINまたはSTART TRANSACTION;事務を明示的に開く.COMMIT;COMMIT WORKも使えますが、両者は等価です.COMMITは事務を提出して、データベースに対して行ったすべての修正を恒久的と呼びます.ROLLBACK;ROLLBACK WORKを使うことができますが、両者は等価です.ロールバックはユーザのトランザクションを終了し、提出されていないすべての修正をキャンセルします.
折り返し点SAVPOINT identifer;SAVPOINTは、事務に保存ポイントを作成することができます.一つの事務に複数のSAVPOINTがあります.RELEASE SAVENPOINT identifer;事務の保存点を削除します.指定された保存点がない場合、この文を実行すると異常が発生します.ROLLBACK TO identifer;事務をマークポイントに戻します.
SAVPOINT adqoo_1 ROLLBACK TO SAVPOINT adqoo_1折返しポイントで発生しました.1前の事務は提出されましたが、その後は無視されました.
SET TRANSACTION;事務の分離レベルを設定します.InnoDB記憶エンジンの事務分離レベルはREAD UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLEです.
MYSQLの事務処理には主に2つの方法があります.1、BEGIN、ROLLBACK、COMMITを使って、BEGINからの一つの事務ROLLBACK事務のロールバックCOMMIT事務の確認2、直接SETでMySQLの自動提出モードを変えます.SET AUTOCOMMIT=0 SET AUTOCOMMITの自動提出禁止=1オープン自動提出
http://www.cnblogs.com/snsdzjlz320/p/5761387.html
•第1レベル:Read Unicomitted(未提出の内容を読み取る)・第2レベル:Read Comitted(提出内容を読み取る)・第3レベル:Repeable Read(読み返すことができる)・第4レベル:Serializable(シリアル化可能)
第1レベル:Read Unicomitted(提出されていない内容を読み取る)
(1)すべてのトランザクションは、他の未提出の事務の実行結果(2)本隔離レベルは、他のレベルよりも性能が優れているわけではないので、(3)このレベルに起因する問題は、「汚い読み(Dirty Read)」です.提出されていないデータが読み取られました.
(1)これはほとんどのデータベースシステムのデフォルトの分離レベルである(ただし、MySQLのデフォルトではない)(2)分離の簡単な定義を満たしている:事務所に提出された変更しか見られない(3)このような分離レベルに問題があるのは、繰り返して読んではいけない(Nonrepeable Read)重複して読んではいけないということは、同じ事務の中で全く同じselect文を実行している時に、異なる結果が見られます.このような状況を招いた原因は、(1)新たなcomitが交差した事務があり、データの変化を招いたことがあります.(2)1つのデータベースが複数のインスタンスによって動作されている場合、同じトランザクションの他の例は、このインスタンス処理の間に新しいcommtがある可能性がある.
第3レベル:Repeable Read(再読み取り可能)
(1)これはMySQLのデフォルト事務分離レベル(2)同じトランザクションの複数のインスタンスがデータを同時に読み出すと、同じデータライン(3)のこのレベルで起こり得る問題であるファントムリーダー(Photom Read):ユーザがある範囲のデータラインを読み出すと、別のトランザクションがこの範囲に新たな行を挿入し、ユーザがその範囲のデータラインを再読み込みすると、新しい「幻影」行(4)InnoDBとFalcon記憶エンジンが複数バージョンの同時制御(MVCC,Multive ersion Concerency Control)機構によって解決されたことがわかった.
この場合は幻読みを解決した場合です.
トランザクションAは、現在の時点のスナップショットSTART TRANSACTION WITH CONSISTENT SNAPSHOPを作成するために、トランザクションを開始し、クエリーを実行します.
同様の効果を達成することもできます.事務Aの最初の照会は、事務Bが起動し、データを挿入する前に開始されますので、SELECTの操作時間を基準にしたtxを作成し、幻読みを回避しました.
(1)これは最高の隔離レベル(2)であり、強制的に事務を並べ替えることにより、互いに衝突することが不可能になり、幻読問題を解決する.つまり、読んでいるデータ行ごとに共有鍵を付けています.(3)このレベルでは、大量のタイムアウト現象とロック競争を引き起こす可能性があります.
第一のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除しないで検索しました.
しかし、A事務udate tx set num=10 where id=1;後(事務を提出していません)、事務B selectデータ表は、事務Aが事務を提出していませんが、udate後のデータを取得します.
第二のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除して調べるだけです.しかし、A事務のudate tx set num=10 where id id=1です.後(事務を提出していません)、事務A selectデータ表は、事務Aが事務を提出していませんが、udate後のデータを取得します.しかし、事務B selectデータ表は、事務Aが事務を提出していません.しかし、udate後のデータは、それぞれの事務において同じselect文を実行しますが、結果は同じではありません.
第三のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除して調べるだけです.しかし、A事務のudate tx set num=10 where id id=1です.後(事務を提出していません)事務A selectデータテーブルは変化していません.事務B selectも変化していません.事務A comit後(事務Bはcomitがありません.)事務Bは再度selectデータ表を作成しましたが、まだ変更されていません.つまり、二つの事務を全部提出しただけで、データの変化が見られます.
まとめ:
提出していません:A事務は修正された値であれば、他の事務は提出が見られます.A事務は1の値を得ました.他のものは2の値を修正しましたが、提出していません.A事務は1の値になりました.他のものは2の値に修正されました.A事務の値はまだ1ですが、他の事務は提出すればA事務の値は変わらないです.A事務が提出されたら、変化の値は2.
実装では、データベース里面はビューを作成します.アクセス時はビューの論理結果に準じています.「繰り返し読み取り可能」レベルでは、このビューはビジネス起動時に作成されます.全体のトランザクションの存在期間はこのビューを使用します.「読み出し提出」隔離レベルでは、このビューは各SQL語句が句をとり始めた時に作成されます.このビューは、隔離レベルで直接記録上の最新値に戻ります.ビューコンセプトはありません.一方、串串串里里里里里化は直接にロックされた方式で、日本人の訪問を避けます.
まとめを見てから文章を読むほうがいいです.
MySQLの事務
***サポートは、MySQLサーバ自体にバインドされているのではなく、記憶エンジンと関連している1.MyISAM:事務をサポートしていない.読み取り専用プログラムの性能向上のために使用される.2.InnoDB:ACID事務、行レベルロック、同時3.Berkeley DB:事務対応
一つの事務は連続的なデータベース操作で、まるで単一の作業ユニットで行われているようです.言い換えれば、グループ内の個々の動作が成功しない限り、完全な事務ではない.事務の操作が失敗すると、事務全体が失敗します.
実際には、クラブの多くのSQLがあるグループに照会し、実行するすべての人が一緒に事務の一部として働きます.
事務の特性:事務には以下の四つの標準属性の略語ACIDがあり、通常は以下のように呼ばれています.
原子性:作業ユニット内のすべての操作が完了することを確認します.そうでないと、問題は故障点で中止され、以前の操作が前の状態に戻ることになります.
整合性:データベースが正確に状態を変えた後、提出された事務を確保する.
隔離性:事務操作を相互に独立し、透明にする.
耐久性:提出されたトランザクションの結果や効果を確保するシステムが故障した場合もあります.
事物制御語句:BEGINまたはSTART TRANSACTION;事務を明示的に開く.COMMIT;COMMIT WORKも使えますが、両者は等価です.COMMITは事務を提出して、データベースに対して行ったすべての修正を恒久的と呼びます.ROLLBACK;ROLLBACK WORKを使うことができますが、両者は等価です.ロールバックはユーザのトランザクションを終了し、提出されていないすべての修正をキャンセルします.
折り返し点SAVPOINT identifer;SAVPOINTは、事務に保存ポイントを作成することができます.一つの事務に複数のSAVPOINTがあります.RELEASE SAVENPOINT identifer;事務の保存点を削除します.指定された保存点がない場合、この文を実行すると異常が発生します.ROLLBACK TO identifer;事務をマークポイントに戻します.
SAVPOINT adqoo_1 ROLLBACK TO SAVPOINT adqoo_1折返しポイントで発生しました.1前の事務は提出されましたが、その後は無視されました.
SET TRANSACTION;事務の分離レベルを設定します.InnoDB記憶エンジンの事務分離レベルはREAD UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLEです.
MYSQLの事務処理には主に2つの方法があります.1、BEGIN、ROLLBACK、COMMITを使って、BEGINからの一つの事務ROLLBACK事務のロールバックCOMMIT事務の確認2、直接SETでMySQLの自動提出モードを変えます.SET AUTOCOMMIT=0 SET AUTOCOMMITの自動提出禁止=1オープン自動提出
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>
事務の4つの隔離レベル:http://www.cnblogs.com/snsdzjlz320/p/5761387.html
•第1レベル:Read Unicomitted(未提出の内容を読み取る)・第2レベル:Read Comitted(提出内容を読み取る)・第3レベル:Repeable Read(読み返すことができる)・第4レベル:Serializable(シリアル化可能)
第1レベル:Read Unicomitted(提出されていない内容を読み取る)
(1)すべてのトランザクションは、他の未提出の事務の実行結果(2)本隔離レベルは、他のレベルよりも性能が優れているわけではないので、(3)このレベルに起因する問題は、「汚い読み(Dirty Read)」です.提出されていないデータが読み取られました.
# mysql :
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
# :
mysql> set tx_isolation='READ-UNCOMMITTED';
Query OK, 0 rows affected (0.00 sec)
# A:
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# B: ( )
B ,
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# A: A ?
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 | ---> ! B
| 2 | 2 |
| 3 | 3 |
+------+------+
# B: B ,
rollback;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# A: A B
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 | ---> (A ), B , , !
| 2 | 2 |
| 3 | 3 |
+------+------+
第2レベル:Read Comitted(提出内容の読み取り)(1)これはほとんどのデータベースシステムのデフォルトの分離レベルである(ただし、MySQLのデフォルトではない)(2)分離の簡単な定義を満たしている:事務所に提出された変更しか見られない(3)このような分離レベルに問題があるのは、繰り返して読んではいけない(Nonrepeable Read)重複して読んではいけないということは、同じ事務の中で全く同じselect文を実行している時に、異なる結果が見られます.このような状況を招いた原因は、(1)新たなcomitが交差した事務があり、データの変化を招いたことがあります.(2)1つのデータベースが複数のインスタンスによって動作されている場合、同じトランザクションの他の例は、このインスタンス処理の間に新しいcommtがある可能性がある.
#
set tx_isolation='read-committed';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
# A:
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# B: ( )
,
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# A: A ?
select * from tx; --------------->
+------+------+ |
| id | num | |
+------+------+ |
| 1 | 1 |---> ! |
| 2 | 2 | |
| 3 | 3 | |
+------+------+ |——> select ,
|
# B: B ? |
commit; |
|
# A: |
select * from tx; --------------->
+------+------+
| id | num |
+------+------+
| 1 | 10 |---> B , A
| 2 | 2 |
| 3 | 3 |
+------+------+
read comitは読むたびに新しいスナップショットです.第3レベル:Repeable Read(再読み取り可能)
(1)これはMySQLのデフォルト事務分離レベル(2)同じトランザクションの複数のインスタンスがデータを同時に読み出すと、同じデータライン(3)のこのレベルで起こり得る問題であるファントムリーダー(Photom Read):ユーザがある範囲のデータラインを読み出すと、別のトランザクションがこの範囲に新たな行を挿入し、ユーザがその範囲のデータラインを再読み込みすると、新しい「幻影」行(4)InnoDBとFalcon記憶エンジンが複数バージョンの同時制御(MVCC,Multive ersion Concerency Control)機構によって解決されたことがわかった.
この場合は幻読みを解決した場合です.
トランザクションAは、現在の時点のスナップショットSTART TRANSACTION WITH CONSISTENT SNAPSHOPを作成するために、トランザクションを開始し、クエリーを実行します.
同様の効果を達成することもできます.事務Aの最初の照会は、事務Bが起動し、データを挿入する前に開始されますので、SELECTの操作時間を基準にしたtxを作成し、幻読みを回避しました.
# ,
set tx_isolation='repeatable-read';
select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
# A:
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
# B: ( )
B ,
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
commit;
# A: B , A ?
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 | ---> !( 2 , 3 )
| 2 | 2 |
| 3 | 3 |
+------+------+
# A: A ,
commit;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
第4レベル:Serializable(シリアル化可能)(1)これは最高の隔離レベル(2)であり、強制的に事務を並べ替えることにより、互いに衝突することが不可能になり、幻読問題を解決する.つまり、読んでいるデータ行ごとに共有鍵を付けています.(3)このレベルでは、大量のタイムアウト現象とロック競争を引き起こす可能性があります.
#
set tx_isolation='serializable';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
# A:
start transaction;
# B: A commit ,
start transaction;
insert tx values('4','4');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
update tx set num=10 where id=1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
理解:第一のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除しないで検索しました.
しかし、A事務udate tx set num=10 where id=1;後(事務を提出していません)、事務B selectデータ表は、事務Aが事務を提出していませんが、udate後のデータを取得します.
第二のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除して調べるだけです.しかし、A事務のudate tx set num=10 where id id=1です.後(事務を提出していません)、事務A selectデータ表は、事務Aが事務を提出していませんが、udate後のデータを取得します.しかし、事務B selectデータ表は、事務Aが事務を提出していません.しかし、udate後のデータは、それぞれの事務において同じselect文を実行しますが、結果は同じではありません.
第三のレベルは二つの事務のうち一つの事務Aが事務を開始し、データテーブルを添削しました.もう一つの事務Bは事務を開始しました.データテーブルを削除して調べるだけです.しかし、A事務のudate tx set num=10 where id id=1です.後(事務を提出していません)事務A selectデータテーブルは変化していません.事務B selectも変化していません.事務A comit後(事務Bはcomitがありません.)事務Bは再度selectデータ表を作成しましたが、まだ変更されていません.つまり、二つの事務を全部提出しただけで、データの変化が見られます.
まとめ:
提出していません:A事務は修正された値であれば、他の事務は提出が見られます.A事務は1の値を得ました.他のものは2の値を修正しましたが、提出していません.A事務は1の値になりました.他のものは2の値に修正されました.A事務の値はまだ1ですが、他の事務は提出すればA事務の値は変わらないです.A事務が提出されたら、変化の値は2.
実装では、データベース里面はビューを作成します.アクセス時はビューの論理結果に準じています.「繰り返し読み取り可能」レベルでは、このビューはビジネス起動時に作成されます.全体のトランザクションの存在期間はこのビューを使用します.「読み出し提出」隔離レベルでは、このビューは各SQL語句が句をとり始めた時に作成されます.このビューは、隔離レベルで直接記録上の最新値に戻ります.ビューコンセプトはありません.一方、串串串里里里里里化は直接にロックされた方式で、日本人の訪問を避けます.