ホームページ  >  記事  >  データベース  >  データベース - 4 つのトランザクション分離レベルの簡単な説明

データベース - 4 つのトランザクション分離レベルの簡単な説明

黄舟
黄舟オリジナル
2017-03-13 16:46:521227ブラウズ

データベースには 4 つのトランザクション分離レベルがあり、異なるロック クラスを使用して実装されます。

4 つの分離レベルのうち、Serializable が最も高いレベルであり、Read Uncommited が最も低いレベルです。 : SQL Server、Oracle などの読み取りコミット
いくつかのデータベースのデフォルトの分離レベルは、
MySQL InnoDB ストレージ エンジンなどの反復読み取りです 最も低いレベルであっても、最初のタイプの更新喪失の問題は発生しません。
1 . ダーティ リード (トランザクションはコミットされていない、事前に読み取られます): ダーティ リードとは、トランザクションがデータにアクセスし、データを変更したが、この時点ではまだその変更がデータベースに送信されていないことを意味します。もデータにアクセスし、このデータが使用されます。
2. 反復不可能な読み取り (2 つの読み取り間の不一致): トランザクション内で同じデータを複数回読み取ることを指します。このトランザクションが終了する前に、別のトランザクションも同じデータにアクセスします。その後、最初のトランザクションの 2 回のデータ読み取りの間で、2 番目のトランザクションの変更により、最初のトランザクションで 2 回読み取られたデータが異なる可能性があります。このように、トランザクション内で 2 回読み取られるデータは異なるため、Non-Repeatable Read と呼ばれます。たとえば、編集者は同じ文書を 2 回読みますが、その合間に作成者が文書を書き直します。編集者が文書をもう一度読むと、文書は変更されています。生の読み取りは再現できません。この問題は、作成者がすべての執筆を終えた後にのみ編集者が文書を読み取ることができるようにすれば回避できます。
3. ファントム読み取り: トランザクションが独立して実行されない場合に発生する現象を指します。たとえば、最初のトランザクションがテーブル内のデータを変更し、この変更にはテーブル内のすべてのデータ行が含まれます。同時に、2 番目のトランザクションもこのテーブルのデータを変更します。この変更により、テーブルに新しいデータの行が挿入されます。その後、最初のトランザクションを操作するユーザーは、あたかも幻覚が起こったかのように、テーブル内にまだ変更されていないデータ行が存在することに気づくでしょう。たとえば、編集者が作成者によって送信されたドキュメントを変更しますが、プロダクションがその変更をドキュメントのマスター コピーにマージすると、作成者が新しい未編集の内容をドキュメントに追加したことがわかります。この問題は、編集者と制作部門が元のドキュメントの作業を完了するまで、誰もドキュメントに新しい内容を追加できないようにすれば回避できます。
4. 1 番目のタイプの更新損失 (ロールバック損失): 2 つのトランザクションが同じデータ ソースを更新する場合、最初のトランザクションが送信され、もう 1 つのトランザクションが取り消されると、更新は最初のトランザクションと一緒に行われます。もキャンセルされました。つまり、最初のトランザクションによって実行された最新のトランザクションは失われます。
5. 2 番目のタイプの更新ロス (カバレッジロス): 2 番目のタイプの更新ロスは、実際のアプリケーションでよく発生する同時実行性の問題であり、通常は非反復読み取りと同じタイプの同時実行性の問題と見なされます。読み取りの特殊なケース: 2 つ以上のトランザクションが同じレコードをクエリし、それぞれが元のクエリ結果に基づいて行を更新すると、2 番目のタイプの更新の喪失が発生します。各トランザクションは他のトランザクションの存在を認識しないため、最後のトランザクションによってレコードに対して行われた変更は、他のトランザクションによってレコードに対して行われたコミット済みの更新を上書きします...
補足: メタデータに基づく Spring 宣言型トランザクション :

分離プロパティは合計 5 つのトランザクション設定をサポートしており、詳細は次のとおりです:


l          DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 . 
l          READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 ) 
l          READ_COMMITTED  会出现不可重复读、幻读问题(锁定正在读取的行) 
l          REPEATABLE_READ 会出幻读(锁定所读取的所有行) 
l          SERIALIZABLE 保证所有的情况不会发生(锁表)

非反復読み取りの焦点は変更です:
同じ条件で、読み取ったデータをもう一度読んで、値が異なることがわかります
ファントム読み取りの焦点は追加または削除です
同じ条件、 1回目と2回目で読み出されるレコード数が異なります

--------------------------------- ------- -------------------
トランザクション伝播動作の種類

Spring は、TransactionDefinitionインターフェースで 7 種類のトランザクション伝播動作を指定します。

トランザクションを指定します。メソッドおよびトランザクション メソッドへのネストされた呼び出しが発生したときにトランザクションがどのように伝播されるか:

表 1 トランザクション伝播動作のタイプ

トランザクション伝播動作のタイプ
説明

PROPAGATION_REQUIRED
現在トランザクションがない場合は、新しいトランザクションを作成しますすでにトランザクションがある場合は、このトランザクションに参加します。これが最も一般的な選択です。

PROPAGATION_SUPPORTS
現在トランザクションが存在しない場合は、非トランザクション方式で実行されます。

PROPAGATION_MANDATORY
現在のトランザクションを使用します。現在のトランザクションがない場合は、例外をスローします。

PROPAGATION_REQUIRES_NEW
現在トランザクションが存在する場合は、新しいトランザクションを作成します。

PROPAGATION_NOT_SUPPORTED
トランザクションが現在存在する場合は、現在のトランザクションを一時停止します。

PROPAGATION_NEVER
非トランザクション方式で実行され、現在トランザクションが存在する場合は例外がスローされます。

PROPAGATION_NESTED
トランザクションが現在存在する場合、そのトランザクションはネストされたトランザクション内で実行されます。現在のトランザクションがない場合は、PROPAGATION_REQUIRED と同様の操作を実行します。

------------------------------------------------ --------
シンプルとは、テンプレートが必要ないことを意味します。xhtml がデフォルトであり、struts2 によって提供されるモジュールがいくつかあります。たとえば、47be180ebd6250130adfc0a776259b0a を追加することができます。 db178c9225816fce969f50614e452850f16b1740fad44fb09bfe928bcc527e08f5a47148e367a6035fd7a2faa965022e 主にインターフェイスの警告とエラー メッセージの処理とページの検証を容易にするためです
struts.properties を確認してください

org/apache/struts2/default.properties
struts.ui.theme=xhtml  
struts.ui.templateDir=template  
struts.ui.templateSuffix=ftl  
你可以在struts.xml中添加
<constant name="struts.ui.theme" value="simple" />来修改这个参数

1 つは、名前が示すように、これらのコンテンツを処理するための CSS の組み合わせです。初心者の場合は、これらのテンプレートの内容を開発に影響を与えたくない場合は、これらを考慮する必要はありません。

ページで css レイアウトが使用されており、struts2 の拡張機能を使用したい場合は、より良いユーザー エクスペリエンスを得るために css_xhtml を使用してください。



以上がデータベース - 4 つのトランザクション分離レベルの簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。