トランザクションの独立性レベル


複数のユーザーが同じデータを同時に変更しようとすると、データベースが提供する機能の1つは独立性レベルです.これは、データの整合性を維持し、パフォーマンスを向上させるために必要です.
複数のトランザクションを同時に処理する場合、トランザクション間の独立性レベル(独立性レベル)は、トランザクション間の独立性の程度を表します.
変更またはクエリーのデータを別のトランザクションで表示できるかどうかを決定できます.
データベースはロックによってトランザクションを独立して実行する必要があります.つまり、あるトランザクションがデータベースを処理するときに他のトランザクションが発生することを防止する必要があります.
ただし、ロックを同時に使用するトランザクションが大量にシーケンス処理されると、データベースのパフォーマンスが低下します.ただし、パフォーマンスを向上させるためにロック範囲を減らすと、エラー値が処理される可能性があります.
そのため、できるだけ効率的なロック方法が必要です!!
Isolation Level
独立性レベルには3つのレベルがあり、ほとんどのデータベースでは、第1レベルのRead Committedが基本レベルです.
ステップ
  • 0:Read Uncommitted
  • ステップ
  • 1:Read Committed
  • ステップ
  • 2:繰り返し可能読み出し
  • ステップ
  • 3:シリアル
  • 手順0のRead Uncommittedは使用できません.PostgreSqlはサポートされていません.
    0. Read Uncommitted
    各トランザクションに対する変更をコミットまたはロールバックしても、他のトランザクションから値を読み込むことができます.これは、他のトランザクションが処理中またはコミットされていない更新データを読み込むことを許可することを意味します.
    Select文の実行中に、データを共有ロックしないレイヤ.データベースの一貫性を維持することは不可能です.高度に隔離された一貫性の問題であるため、使用は推奨されません.
    Dirty Read現象
    取引任務を遂行していないのに、他の取引で見られる現象を指す.
    例えば、A事務では、3番の学生の成績がBからAに変更され、まだ提出されていません.
    このとき、B事務で3番の学生の成績を調べると、Aが読み出されます.(Dirty Read)
    しかしその後、A取引に問題が発生し、ロールバックが発生した.
    しかし、B事務では、3番の学生の成績は依然としてAで、論理を実行している.
    データの整合性に問題が発生しました.
    1. Read Committed
    コミットされたデータのみを読み込む独立性レベルとして、Oracleは基本的に使用します.Select文の実行中に、Shared Lockによってデータが上書きされます.
    トランザクションの間、他のトランザクションはアクセスできず、待機できません.
    実際のテーブル値ではなく、Undo領域にバックアップされたレコードから値を取得します.コミットされていないデータを読み込めないため、Dirty readは発生しません.
    繰り返し不可能読み出し現象なし
    これは、同じトランザクション内で同じクエリーを2回実行したときに異なる値が発生する読み取り現象です.特定のデータを変更すると表示される場合があります.
    例えば、A取引では、3番社員の年齢を25歳から27歳に変更する.
    コミットされていない場合、Bトランザクションが3番目の従業員の年齢を問い合わせると、undo領域の25歳がわかります.
    A事務が以降の変更を提出したが、まだ完了していないB事務が3番職員の年齢を再度照会すると、今回は提出した27歳の年齢を照会します.
    これは、1つのトランザクション内で同じクエリーを実行するときに、常に同じ結果を取得しなければならない重複読み取りの一貫性とは異なります.
    これらの問題は主にアクセス処理を行う金銭処理で発生し,データ整合性が破壊され,エラー検索が困難になる.
    2. Repeatable Read
    デフォルトでは、MysqlはShared Lockを1つのレイヤとして使用し、トランザクションが完了する前にselect文は使用するすべてのデータに共有ロックをかけます.
    データをクエリーするときは、常に同じデータ応答を保証します.
    他のユーザーは、取引領域のデータを変更できません.
    Mysqlでは、各トランザクションにトランザクションIDが付与され、そのトランザクションIDよりも小さいトランザクション番号でコミットされたトランザクションのみが読み込まれます.
    Undoスペースにデータをバックアップし、実際のレコード値を変更します.バックアップしたデータは、不要と判断した場合に定期的に削除されます.Undoにバックアップするレコードが多ければ多いほど、Mysqlサーバの処理性能が低下します.この変更をマルチバージョン通貨制御(MVCC)と呼ぶ.
    繰り返し不可能読み出し不一致なし.
    例えば、id 10号取引で3号商品の価格を照会すると、1000元の価格が得られます.
    その後、12日の取引で3号商品の価格を1500ウォンに変更して提出した.
    10回の取引後、再び商品の価格を照会すると、Undoエリアにバックアップされたデータを返し、再び1000ウォンの価格を受け取る.
    Undo領域にバックアップされたすべてのレコードには、変更されたトランザクションの番号が含まれているため、変更された(コミットされた)値は、そのトランザクション番号よりも低いトランザクション番号にのみ表示されます.
    Phantom Read現象
    Repeatable Readレベルでは、Shared Lock状態でのデータが変更されないことを確認しますが、新しいデータを追加または削除できます.
    Phantom Readとは、あるトランザクションで一定範囲のレコードを複数回読み出すと、別のトランザクションで実行される変更操作によって、あるレコードが表示されるか、表示されないかを意味します.
    すなわち、トランザクション中に外部タスクにないローが追加され、新しく入力したデータが読み込まれたり、トランザクション中にデータが削除されたりして、次回の読み取り時に以前に存在していたローが消えてしまいます.
    たとえば、10回のトランザクションでAテーブルの行数をcount(*)としてクエリした場合、結果値は2になります.
    その後、12番のトランザクションはAテーブルでinsertを実行してコミットします.
    10番のトランザクションが同じクエリ文でロー数を読み込むと、3の値が得られます.
    このような事態を防止するためには、書き込みロックが必要です.
    3. Serializable
    これは共有ロックの階層で、トランザクションが完了する前に、レイヤはSelect文を使用してすべてのデータを共有し、完全な読み取り一貫性モードを提供します.
    1つのトランザクションですべてのタスクを処理するなど、高い独立性レベルを提供します.孤立度が高いため,同期処理効率は低い.
    他のユーザーは、トランザクション領域に対応するデータを変更または入力できません.
    Phantom Readは発生しませんが、データベースではあまり使用されません.
    整理する
    レベルが高いほど、トランザクション間の孤立度は高くなりますが、パフォーマンスは低下します.通常のサービスでは、Read Committed(Oracle)またはRepeatable Read(Mysql)が使用されます.
    トランザクション・独立性レベルは、同期性とデータ整合性に関連します.
    同期性を高めると、データ整合性に問題が発生し、データ整合性を維持すると同期性が低下します.
    데이터베이스는 다수의 사용자들이 동시에 접근하는 경우가 빈번하게 발생하는데, 이 때 사용자들에 대한 적절한 통제가 이루어지지 않으면 데이터베이스의 무결성이 깨지고 트랜잭션 수행에 대해 의도하지 않은 결과가 반환될 수 있다.
    
    DBMS는 동시성 제어 기능을 제공하여 데이터베이스의 무결성을 보호하고, 트랜잭션이 항상 정확하고 일관된 데이터를 참조할 수 있도록 한다.
    
    데이터베이스에서 동시성은 트랜잭션을 구성하는 각각의 쿼리문들이 트랜잭션의 순서에 상관없이 동시에 실행되는 것을 말한다. 반대의 의미로 직렬성은 각각의 트랜잭션이 일정한 순서를 가지고 순차적으로 실행되는 것을 말한다.
    데이터 무결성(Integrity)은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말한다.
    
    - 개체 무결성: 모든 테이블은 기본키를 가져야 한다. 기본키는 null값이나 중복값을 가질 수 없다.
    - 참조 무결성: 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 가지도록 한다. 참조 대상이 존재하지 않는 외래 키를 허용하지 않는다.
        - Restricted: 레코드를 참조하고 있는 개체가 있으면 변경이나 삭제 연산을 취소
        - Cascade: 레코드를 참조하고 있는 개체도 변경 또는 삭제함
        - Set Null: 레코드를 참조하고 있는 개체의 값을 null로 설정
        
    - 도메인 무결성: 특정 속성의 값이 그 속성이 정의된 도메인에 속한 값이어야 한다. (성별 속성의 도메인은 '남'과 '여'로 그 외의 값은 입력할 수 없다)
    - 무결성 규칙: 데이터의 무결성을 지키기 위한 모든 제약 사항으로, 데이터베이스 전체에 공통적으로 적용되는 규칙