転送:https://www.cnblogs.com/daofaziran/p/10933302.html
入門
汚れは、データベース、非反復可能読み取りを読み込みファントムは、分離および関連事項の両方をお読みください。だから、最初のトランザクションの四大特徴を見てください。
トランザクション(ACID)の4つの主要な特徴:
アトミック(原子性):トランザクションは、作業データベースの論理的な単位である、すべての実行またはすべての実行されないいずれかのデータベースを変更します。
一貫性(Consistemcy):トランザクションの前と後に、データベースの状態は、すべての整合性制約を満たしています。
分離(隔離):N同時に実行トランザクションが分離されて、一方が変更されたデータを(データベース分離レベルを設定することにより)他のトランザクションによって見ることができない、トランザクションをコミットの非存在下でいずれかの影響を与えません。
永続性(耐久性):更新の永続化手段システムやメディア障害が、コミットされたトランザクションが失われることができないことを確認してくださいとき。永続主に回復パフォーマンスDBMS。
ダーティ読み取り:
また、汚れたとして知られている無効なデータの読み出しをお読みください。トランザクションが別のトランザクションがまだダーティリードと呼ばれるデータが登録されていません読み込みます。
例えば:トランザクションT1はデータの行を変更したが、提出されていない、トランザクションT2は、データが何らかの理由でトランザクションのロールバックした後にトランザクションT1、T1が変更されている読み出し、この時間は、その後、読み出しデータトランザクションT2が汚れています。
溶液:データベーストランザクション分離レベルはREAD_COMMITTEDに調整されます
非反復可能読み取り:
同じトランザクション内の非反復可能読み取り手段は、同じ2つのクエリは異なる結果を返します。
たとえば、次の読み出しデータトランザクションT1、T2トランザクションは、読み出しをテストし、データを再度読み取り、異なる結果を得るために、T1の値をデータを読み取り、変更します。溶液:データベーストランザクション分離レベルはREPEATABLE_READに調整されます
ファントムを読みます:
たとえば、次のように特定のポイントの代わりにABCDEレベルからのすべての学生の性能のAデータベースシステム管理者が、Aシステム管理者の最後は変更があることがわかったとき、この時点では、特定のレコードのスコアを挿入するシステム管理者Bレコードには、同じような錯覚が起こったと同じように、一晩変更しません。これは、ファントム読み取りと呼ばれています。
溶液:データベーストランザクション分離レベルはSERIALIZABLE_READに調整されます
汚れは、反復不能読み取り、ランクのファントム読み取りを読み込みます:ダーティリード<またとない読書「ファントム読み取り。だから、SERIALIZABLE_READの最高レベルを設定するにはREPEATABLE_READとREAD_COMMITTEDに設定されていないでしょう
違い
非反復可能読み取り
非反復可能読み取りフォーカスが変更することで
、同じ条件を、あなたは値が同じではありません発見し、再び読み出し、データを読み取るために持っていました
例:トランザクション1では、メアリーは、操作が完了しなかった、彼の1000年の給与を読みます
--在postresql中的例子,可能和其他的数据库略有区别
begin transaction;
select salary from employee
where id = MaryID;
問題2では、時に財務スタッフは、2000年のメアリー賃金を変更して、トランザクションを提出しました。
begin transaction;
update employee
set salary = 2000
where id = MaryID;
commit;
トランザクション1が、メアリーは再び彼らの賃金を読んだとき、給与が2000上がります
select salary
from employee
where id = MaryID;
トランザクションの前と後の結果は、2つの非反復可能読み取り、その結果、有効に読み取ることがありません。
マジック読書
マジックリーディング焦点は、追加または削除することで
、同じ条件を、レコードの第一及び第二の数を読み出す同じではありません
例:従業員1,000人10人の現在の賃金。
トランザクション1は、従業員1,000人のすべての賃金を読み込みます。
begin transaction;
select * from employee
where salary = 1000;
-- 共读取10条记录
その後、別のトランザクションが、employeeテーブルに1000年の賃金を従業員のレコードを挿入します
begin transaction;
insert into employee(,salary,)
values(,1000,);
commit;
トランザクション1は、従業員1000再びすべての賃金を読み込み
--事务1
select * from employee
where salary = 1000;
--共读取到了11条记录
これは、ファントム読み取りを作成します。