【データベースのトランザクション(一)】トランザクションとは何か、およびトランザクションの4つの特性、およびトランザクションの同時問題と独立性レベル


1.トランザクションとは、アプリケーション内の一連の厳密な操作であり、すべての操作が正常に完了しなければならない.そうしないと、各操作で行われたすべての変更が取り消されます.つまり、トランザクションには原子性があり、1つのトランザクションの一連の操作はすべて成功するか、1つもしないかのいずれかです.トランザクションの終了には2つあり、トランザクション内のしたがってステップがすべて正常に実行されると、トランザクションがコミットされます.いずれかのステップが失敗すると、ロールバック操作が発生し、トランザクションの開始時までの操作を元に戻します.二.トランザクションのACIDトランザクションには4つの特徴があります.
原子性(Atomicity)、
コンシステンシ(Consistency)、
隔離性(Isolation)
持続性(Durability).
この4つの特性は、ACID特性と略称される.1、原子間トランザクションはデータベースの論理作業単位であり、トランザクションに含まれる各操作はすべて行うか、しないかのいずれかである.2、コンシステンシトランザクションの実行結果は、データベースを1つのコンシステンシ状態から別のコンシステンシ状態に変更する必要がある.したがって、データベースに成功したトランザクションのコミット結果のみが含まれている場合、データベースは一貫性のある状態にあります.データベース・システムの実行中に障害が発生した場合、一部のトランザクションが完了していないと中断され、これらの未完了トランザクションがデータベースに加えた変更の一部が物理データベースに書き込まれている場合、データベースは正しくない状態、または一致しない状態になります.3、独立性1つのトランザクションの実行は他のトランザクションに干渉されない.すなわち、1つのトランザクション内部の操作および使用されるデータは、他の同時トランザクションから分離され、同時実行される各トランザクション間で相互に干渉することはできません.4、持続性は永続性とも呼ばれ、トランザクションがコミットされると、データベース内のデータの変更が永続的であるべきであることを意味します.次の他の操作や障害は、その実行結果に影響を与えるべきではありません.トランザクション内のすべての操作はすべて実行されるか、実行されません.トランザクションに原子的な保証がない場合、システム障害が発生した場合、データベースが不一致になる可能性があります.
三、トランザクションの独立性レベルと同時発生の問題
データベース・システムには、ユーザーが選択できる4つのトランザクション・独立性レベルが用意されています.A.Serializable(シリアル化):1つのトランザクションが実行中にデータベースに対する他のトランザクションの更新がまったく表示されません.(トランザクションの実行時に他のトランザクションの同時実行は許可されません.トランザクションがシリアル化され、トランザクションは1つずつ実行され、同時実行はできません.)B.Repeatable Read(繰り返し読み取り可能):1つのトランザクションでは、実行中に他のトランザクションがコミットした新しい挿入レコードが表示されますが、他のトランザクションによる既存のレコードの更新は表示されません.C.Read Commited(コミットされたデータを読む):1つのトランザクションは、実行中に他のトランザクションがコミットした新しい挿入レコードを表示し、他のトランザクションがコミットした既存のレコードの更新を表示します.D.Read Uncommitted(コミットされていないデータの読み取り):1つのトランザクションでは、実行中に他のトランザクションがコミットされていない新しい挿入レコードが表示され、他のトランザクションがコミットされていない既存のレコードの更新が表示されます.
 
 
更新が失われました
汚読
ノンリピートリード
更新の上書き
幻読み
未読
Y
Y
Y
Y
Y
コミットされた読み取り
N
N
Y
Y
Y
リピート可能
N
N
N
N
Y
シリアル化
N
N
N
N
N
同時性の問題は、次のように分類されます.
A.紛失更新:一つの取引を取り消した場合、他のトランザクションがコミットした更新データを上書きする(AとBトランザクションが同時に実行され、Aトランザクションが更新された後、コミットされる;BトランザクションはAトランザクションが更新された後、Bトランザクションが終了する前にそのローデータの更新操作を行い、ロールバックすると、2回の更新操作が失われる).(AとBのトランザクションが同時に実行され、Bのトランザクションが更新を実行した後、AのトランザクションはBのトランザクションがコミットしていないデータを問合せ、Bのトランザクションがロールバックされると、Aのトランザクションが取得したデータはデータベース内の真のデータではありません.つまり、汚いデータ、つまりデータベース内の一致しないデータです).C.繰り返して読むことはできません:あるトランザクションは別のトランザクションがコミットした更新データを読みます.(AとBトランザクションが同時に実行され、Aトランザクションがデータを問合せ、Bトランザクションがデータを更新し、Aが再びデータを問合せたときに、そのデータが変化したことが判明した).D.上書き更新:これは繰り返し不可読み出しの特例であり、あるトランザクションが別のトランザクションがコミットした更新データを上書きする(すなわち、Aトランザクションがデータを更新し、Bトランザクションがそのデータを更新すると、Aトランザクションクエリは自分が更新したデータが変わったことに気づく).
 
E.虚読(幻読み):ある取引は別の取引が提出した新しく挿入したデータ(AとBの取引が同時に実行され、Aの取引はデータを照会し、Bの取引はデータを挿入または削除し、Aの取引は再び照会して結果セットに以前ないデータがあるか、または以前のデータが消えたことを発見する)を読み取る.
四、事務における同時問題の詳細
データベース・システムには4つの独立性レベルがあります(ほとんどのデータベースのデフォルト・レベルはread commitedです).データベースでどの独立性レベルを使用するかは慎重に分析してください.
1.最も高い独立性レベルを維持することは、データのエラーを防止しますが、並列性の損失とデッドロックの発生の可能性が増加します.
2.しかし、独立性レベルを下げると、発見しにくいバグが発生します.
 
SERIALIZABLE(シーケンス化)
 
範囲ロック(表ロック、ページロックなど、range lockについては、transaction Aが終了するまで、私も深く研究していません)を追加します.これにより、他のtransaction Bがこの範囲内のinsert、updateなどの操作を阻止します.
 
幻読み、汚れ読み、繰り返し不可などの問題は発生しません.
 
REPEATABLE READ(繰り返し読み可能)
 
読み出したレコードについては、transaction Aが終了するまで共有ロックを追加する.他のtransaction Bがこのレコードを変更しようとすると、transaction Aが終了するまで待機します.
 
発生する可能性のある問題:範囲クエリーを実行すると、幻読みが発生する可能性があります.
 
READ COMMITTED(提出読み)
 
Transaction Aでデータを読み込むとレコードに共有ロックが追加されますが、読み込みが終了するとすぐに解放されます.他のtransaction Bがこのレコードを変更しようとすると、transaction A全体の終了を必要とせずに、Aの読み取りプロセスが終了するまで待機します.したがって、transaction Aの異なる段階において、同一レコードに対する読み取り結果が異なる場合がある.
 
発生する可能性のある問題:繰り返して読むことはできません.
 
READ UNCOMMITTED(未提出読み)
 
共有ロックは追加されません.したがって、他のtransaction Bは、transaction Aによるレコードの読み取り中に同じレコードを変更することができ、Aによって読み取られたデータが破壊されたり、不完全で不正確なデータになったりする可能性がある.
 
また、transaction Aではtransaction B(コミットされていない)で修正されたデータを読み取ることができる.例えばtransaction BはRレコードに対して修正されたがコミットされていない.このときtransaction AでRレコードを読み出し、Bで修正されたデータを読み出す.
 
発生する可能性のある問題:汚い読み.
 
 
に質問
 
異なる独立性レベルを実行すると、さまざまな問題が発生する可能性があります.以下にそれらをまとめ、例を挙げて説明する.
 
まぼろし読み
 
幻読みは、2つのまったく同じクエリーが実行されると、2回目のクエリーが返す結果セットが1つ目のクエリーとは異なる場合に発生します.
 
発生した場合:範囲ロックはありません.
 
例:
 
トランザクション1
トランザクション2
SELECT
 * FROM
users
WHERE
age BETWEEN
10
AND
30
INSERT
INTO
users VALUES
(
3
, 'Bob'
, 27
);
COMMIT;
 
SELECT
* FROM
users WHERE
age BETWEEN
10
AND
30;

 
 
:シーケンス された モードを すると、どの レベルの でも する があります.
 
り し
ロックベースのパラレル では、selectを するときにリードロックを しないと、 しない み りの が します.
マルチバージョンパラレル メカニズムでは、コミット に したトランザクションがロールバックされ、 される がある 、 しない み りの が します.
 
トランザクション1
トランザクション2
SELECT
* FROM
users WHERE
id = 1;
UPDATE
users SET
age = 21
WHERE
id = 1
;
COMMIT; /* in multiversion concurrency*/
   control, or lock-based READ COMMITTED *
SELECT
* FROM
users WHERE
id = 1;
COMMIT; /* lock-based REPEATABLE READ */

 
の では、トランザクション2のコミットに し、その が されます.しかし、トランザクション1は の を み した.シーケンス および し な レベルでは、データベース システムは、トランザクション2によって される の である い を します.コミットされた み りとコミットされていない み りの レベルでは、 された が される があります.これが「 り し み り 」です.
 
この の を するには、 の2つのポリシーがあります.
1.トランザクション1がコミットまたはロールバックされるまで、トランザクション2の を します.このポリシーは、ロックを するときに されます.( なロックメカニズム、 えばselect for updateでデータ に なロックを する)
2. バージョンの では、トランザクション2を にコミットできます.トランザクション1は、 いバージョンのデータに き き されます.トランザクション1が にコミットしようとすると、データベースはトランザクション1、トランザクション2の と じ を します.もしそうであれば、トランザクション1のコミットは しました.そうでない 、トランザクション1はロールバックされます.( ロック )
 

ダーティリードは、あるトランザクションAが のトランザクションBによって されたが、まだコミットされていないデータを み った に する.Bがロールバックした 、トランザクションAは なデータを み します.これは み み と ていますが、2 のトランザクションではコミットを する はありません. 
 
トランザクション1
トランザクション2
SELECT
* FROM
users WHERE
id = 1
UPDATE
users SET
age = 21
WHERE
id = 1
SELECT
FROM
users WHERE
id = 1
COMMIT; /* lock-based DIRTY READ */