記事のディレクトリ
MySQLのトランザクション
まず、基本的な導入業務
1、概念:
如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同时失败。
図2に示すように、操作
(1)开启事务:start transaction;
(2)回滚:rollback;
(3)提交:commit;
3、例:ジョー・スミスジョン・ドウ500元を転送します
-- 0.开启事务
start transaction;
--1.张三账户-500
update account set balance =balance-500 where name="zhangsan"
--2.李四账户+500
update account set balance =balance+500 where name="lisi"
--3.出现异常,回滚
rollback;
--4.无异常,提交
commit;
4、MySQLデータベースは、デフォルトの自動コミットトランザクション
4.1、取引の二つの方法がコミットします。
1.自動提出
Oracleのデフォルトマニュアル提出
MySQLが自動的に送信された
DML(追加および削除)ステートメントは自動的にトランザクションを提出します。
2.手動で提出する
最初のオープン・トランザクションをし、その後に提出
4.2、デフォルトのトランザクションの提出を変更します。
1.查看事务的默认提交方式:
select @@autocommit;
1 代表自动提交
0 代表手动提交
2.修改默认提交方式(修改成手动)
set @@autocommit = 0;
第二に、トランザクションの4つのプロパティ(ACID)
- 不可分性
- 一貫性
- 隔離
- 持久性
1、アトミック(不可分)
原子性はすべて成功するか、すべてのロールバックに失敗のいずれかに含まトランザクション内のすべての操作を指します。
操作は、データベースへの影響を持つことができません失敗した場合、したがって、トランザクションの操作は、成功した場合、それは完全にデータベースに適用されなければなりません。
2.一貫性(整合性)
一貫性は、データベースを作成する必要がありますトランザクションを指し、1つの一貫性のある状態からの遷移別の一貫した状態、
トランザクションの実装と言うことです前にしての実装ポストがでなければなりません一貫性のある状態に。
たとえば:
両方のユーザーAとユーザーBのお金は1000の合計まで追加することを前提とし、その後、関係なく、AとBの間の転送は、お金が2人のユーザーまで追加のトランザクションが終了した後、いくつかのアカウントを有効にする方法は1000でなければならないはずです、これは、トランザクションの一貫性です。
図3に示すように、分離(単離)
このようなテーブルを用いて同時に動作する場合、各ユーザトランザクションオープン用のデータベース、動作は、他のトランザクションによって妨害されないようなデータベースへのユーザの同時アクセスする複数の分離同時複数のトランザクションの間、互いに分離されます。
図4に示すように、永続的な(耐久性)
永久的である、それは操作の失敗を経験した取引でも、データベース・システムの場合に失われることはありませんコミットトランザクションがコミットされると、データベース内のデータを変更することを永続手段。
第三に、分離レベル
分離レベルが高いほど、それがデータの整合性と一貫性を確保することができるが、同時パフォーマンスへの影響も大きいです。
MySQLのデフォルトの分離レベルが反復可能読み取りです。反復可能読み取り
データベースのトランザクション分離レベルが低いから高い順に、4以下のとおりです。
1、読み取り(読み取り、READ UNCOMMITTEDに許可されていない)コミットされていません
トランザクションがデータを書き込む開始されている場合は、別のトランザクションを同時に書き込むことができますが、他のトランザクションがトリップデータを読み取ることができますされています。
分離レベルは、達成するために、「排他的な書き込みロック」することができます。
これは、失われた更新を回避しますが、ダーティリードを表示されることがあります。
ダーティ読み取り:そのトランザクションBがAがコミットされていないデータのトランザクションを読み取ること。
2、読み取り(読み取り提出を読むことを許可)約束しました
読み出しデータトランザクションが他のトランザクションがデータの行へのアクセスを継続できますが、書き込みコミットされていないトランザクションが行にアクセスすることから、他のトランザクションを防ぐことができます。
分離レベル回避の汚れを読み取り、それは非反復可能読み取りを表示されることがあります。
非反復可能読み取り:トランザクションA先読みデータ、トランザクションBすぐにデータを更新し、トランザクションを提出トランザクションAがもう一度データを読み込みながら、データが変更されました。
3、反復可能読み取り(反復可能読み取り)(MySQLのデフォルト)
反復可能読み取りは、同じデータを複数回読んで、取引を指します。
この取引が終わっていない場合は、別のトランザクションは、同じデータにアクセスします。
次に、データを変更する第2のトランザクションは、最初の2つのリードデータトランザクションが同じであっても、最初のトランザクションに両者の間のデータを読み出します。
これは、2倍のデータでは、トランザクションが同じ、いわゆる反復可能読み取りで読んで発生します。
読み出しデータトランザクションが書き込みトランザクション(ただし、読み取りトランザクションを可能にすること)によって禁止されて、書き込みトランザクションは、他の取引を禁止します。
これは、非反復可能読み取りとダーティリード、時にはファントム読み取りを表示されることが避けられます。
によって達成し、「排他的な書き込みロック」「読み取りロックを共有」することができます(読み出しトランザクションデータ)。
4、シリアライズ(直列化)
厳格なトランザクション分離を提供します。
これは、トランザクションが同時にではなく、1で行うことができ、トランザクションのシリアル化が必要。
専用トランザクションのシリアル化を達成することができない「行レベルロック」する場合は、新たに挿入されたデータだけを介して他のメカニズムを介しての取引照会アクセスを実行していないことを確認しなければなりません。
シリアライズが最高のトランザクション分離レベルですが、価格も最も高価な、低パフォーマンスで、めったに回避の汚れのみならず、そのレベルの下で、分岐順序を使用しないことは、非反復可能読み取りを読み込み、だけでなく、ファントム読み取りを避けるために。
第四に、楽観と悲観的ロックロック
ペシミスティック・ロック、誰かが私傷つけるしたい
楽観的ロックを、正義は長い腕を持っています