データベーストランザクションの基礎知識

春は柔軟かつ便利なトランザクション管理機能を提供しますが、これらの機能は、それ自体が動作するデータベースの基本的な取引メカニズムに基づいているが。Springのトランザクション管理と構成の詳細については、それがデータベーストランザクション学習の基本に必要です。


1.データベーストランザクションは何である
「繁栄、双方にとって損失。」「この文は、いずれかを有効にするに全部、または全体的な障害など、複雑な物事の多くは、ステップバイステップであることを、トランザクションを反映すると考え、彼らは全体を構成しているされています。この思考の種類は、つまり、データベース内の複数のSQL文を反映し、またはすべてが成功するか、すべて失敗行います。

データベースのトランザクションは、厳密に定義され、それは4つのプロパティを満たす必要があります:アトミック(原子)、一貫性(一貫性)、アイソレーション(分離)と持続性(Durabiliy)を、ACIDと呼ばれます。以下では、各機能の説明です。

1)の原子:データベース操作の複数からなるトランザクションを表し、すべての操作が行われ、全体のトランザクション提出する場合にのみ、不可分原子単位です。任意のデータベース操作は、データベースが初期状態に戻っているように実行されたすべての操作が、撤回されなければならない、トランザクションに失敗しました。

2)一貫性:データベースの状態とそのビジネスルールが同一である成功したトランザクション操作の後、そのデータが破壊されないであろう。このようなB 100元を考慮して、アカウントAからの転送金として、関係なく、操作の成功の、総預金はAとBのアカウントが変更されていないアカウント。

3)単離:データの同時動作は、トランザクションが異なるそれぞれのデータスペースがあり、彼らは他の動作を妨げることはありません。むしろ、要件が完全に無干渉しません。データベーストランザクション分離レベルの多様性を提供し、異なる分離レベルは、干渉の度合いに対応し、より高い分離レベル、データの整合性が良好であるが、より弱い並行性。

4)耐久性:トランザクションが正常にコミットされると、すべての操作におけるトランザクションデータは、データベースに永続化する必要があります。トランザクションがコミットされた後も、データベースはすぐにクラッシュし、データベースを再起動し、データがいくつかのメカニズムを介して回収できることを確認する必要があります。

これらの取引の特性では、データ「一貫性」が究極の目標である、他の機能は、要件や手段を取るためにこの目標を達成するための措置です。

一般的に再実行ログの原子性、一貫性と耐久性を確保するために使用するデータベース管理システム。すべての動きのデータベースの変更、データベースエラーがトランザクションでの操作の実装の出口部の後に発生したヘビー実行ログ・レコードは、データベースが重く実行ログの下で行われていた元に戻すことができます。さらに、トランザクションのためにもデータベースがクラッシュした場合、データベースを再起動する場合は、永続データに対応する動作を再実行することができ、提示されたログに基づいてされていません。

オブジェクトロック機構同様のスレッド同期、トランザクションを確実にするために、データベースのロック分離機構を使用して、データベース管理システムを使用してJavaプログラム。複数のトランザクションが同じデータを操作しようとしているときに、トランザクションデータはロックを操作する前のトランザクションが完了した後、その後のトランザクションがデータを操作する機会を持つまで開催されます。Oracle Databaseはまた、メカニズムのデータ・バージョンを使用して、データに影響を与えることなく、データへの変更のバージョンを保存する各変更のロールバックデータが読み込まれます。


2.データの並行性の問題

データベースは、複数のアクセスクライアントを有していてもよく、これらのクライアントは、データベースへの同時アクセスが可能です。

データベース内の同じデータが取られていない場合、必要な検疫措置は、データの整合性を弱体化、並行性の問題のすべての種類につながる、複数の業務によって同時にアクセスすることができます。これらの問題は、問題を読んでデータの3種類(ダーティ・リード、非反復リードとファントム読み取り)及びクラス2のデータ更新問題(第一種及び失われたアップデートの第二のタイプの更新を失った)を含む、5つのカテゴリーに帰することができます。次は、問題を引き起こすことによってシーンを説明するための例です。

1)ダーティリード(ダーティリード)
データBを変更するには、トランザクションがコミットされていないトランザクションを読んで、このデータに基づいて動作されます。あなたはBのトランザクションに起こる場合はロールバックされ、トランザクション読み取られたデータは、単純に認識されていません。ビュー出納取引汚れの同時トランザクションと転送がシーンを読み込む場合に発生します。

このシナリオでは、Bの希望の引き出し$ 500が、後の動きを撤回し、同時に同じ口座振替$ 100からA、トランザクションが読み込むため、データBのトランザクションが無駄口座に500元の損失で、その結果、提出されていません。Oracleデータベースでは、ダーティリードの場合は発生しません。

2)非反復可能読み取り(またとないリード)

反復不能読み取りトランザクションは、データ・トランザクションを変更するには、Bがコミットしたことを意味読み込みます。出金は、取引中、Bは100元に口座振替で、口座両者のバランスが不整合が発生読み取ることが想定されます。

同じトランザクションでは、時間T4とT7時間の口座預金残高ポイントが矛盾読み取ります。

3)ファントムを読み出し(ファントム)が読み込ま

トランザクションは、Bから提出された新しいトランザクション・データを読み込み、その後、ファントムが業務を読んで問題が表示されます。ファントムは、一般的に読み、統計データトランザクションの計算で発生します。たとえば、同じ取引預金口座の統計で二回銀行システムの合計量は、統計的プロセスは二回、ただ普通預金口座を追加したことを想定し、二回、その後、合計統計$ 100、堆積量は一貫性がなくなります。

新しいデータがちょうどクエリの業務を満たすようにした場合、新しいデータが矛盾した統計2例で、その結果、トランザクションの視野に入っています。

ファントムは読み込み、非反復可能読み取りは、二つの概念を混同しやすい、前者は他の新しいデータを読み取るために指し、後者はリード・トランザクションを指しながら、トランザクションに提出されたデータ(変更をまたは削除)を変更することが提出されました。どちらの場合を避けるために、対策を取ることは別である:データの読み出しへの変更を防止するために、データは、データ操作の変更を防止するためにのみ行レベルのロックの操作に追加され、新たなデータを読み出す避けることがしばしば必要テーブルロック111を追加すると、新しいデータを防ぐために、テーブル全体をロックします(Oracleデータは仕方の複数のバージョンを使用して)。

4)最初のカテゴリにはアップデートが含まれていません

場合は、トランザクション・後退、更新データBのトランザクションは、カバーを提出されました。このエラーは、次のアカウント引き出し転送から見ることができ、非常に深刻な問題を引き起こす可能性があります。

失効時のトランザクションは、「偶然」Bの取引は金額が口座に一掃転送されているでしょう。

5)第二のカテゴリーは、更新が不足しています

Bの取引をカバーするトランザクションデータが操作を行うためにB会社の損失が生じ、コミットしています。

チェック転送トランザクションは預金の引き出しを更新するために作られたトランザクションをカバーしているため、上記の例では、銀行は最終的に$ 100の損失につながります。最初の転送トランザクションがコミットする場合は逆に、ユーザーアカウントは100元を失うことになります。

 

3.データベースのロック機構

データの同時実行性は、多くの問題を引き起こす可能性があり、場合によっては、問題のいくつかは許可されているが、他の例では致命的なことができます。実装の詳細に異なるデータベースに違いがあるものの、データベースのロック機構は、同時アクセスによる問題を解決するために、原則的には、基本的に同じです。

按锁定的对象的不同,一般可以分为表锁定和行锁定。前者对整张表进行锁定,而后者对表中的特定行进行锁定。从并发事务锁定的关系上看,可以分为共享锁定和独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定。而独占锁定既防止其他的独占锁定,也防止其他的共享锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,INSERT、UPDATE、DELETE 和 SELECT FOR UPDATE 语句都会隐式采用必要的行锁定。下面介绍一下Oracle数据库常用的5种锁定。

1)行共享锁定:一般通过 SELECT FOR UPDATE 语句隐式获得行共享锁定,在Oracle中用户也可以通过 LOCK TABLE ROW SHARE MODE 语句显式获得行共享锁定。行共享锁定并不防止对数据行进行更改操作,但是可以防止其他会话获取独占性数据表锁定。允许进行多个并发的行共享和行独占锁定,还允许进行数据表的共享或者采用共享行独占锁定。

2)行独占锁定:通过一条 INSERT、UPDATE 或 DELETE 语句隐式获取,或者通过一条 LOCK TABLE IN ROW  EXCLUSIVE MODE语句显式获取。这种锁定可以防止其他会话获取一个共享锁定、共享行独占锁定或独占锁定。

3)表共享锁定:通过 LOCK TABLE IN SHARE MODE 语句显式获得。这种锁定可以防止其他会话获取行独占锁定(INSERT、UPDATE 或 DELETE),或者防止其他表共享行独占锁定或表独占锁定,但它允许在表中拥有多个行共享和表共享锁定。该锁定可以让会话具有对表事务级一致性访问,因为其他会话在用户提交或者回滚该事务并释放对该表的锁定之前不能更改这张被锁定的表。

4)表共享行独占锁定:通过 LOCK TABLE IN SHARE ROW EXCLUSIVE MODE 语句显式获得。这种锁定可以防止其他会话获取一个表共享、行独占或者表独占锁定,但允许其他行共享锁定。这种锁定类似于表共享锁定,只是一次只能对一张表放置一个表共享行独占锁定。如果A会话拥有该锁定,则B会话可以执行 SELECT FOR UPDATE操作;但如果B会话试图更新选择的行,则需要等待。

5)表独占锁定:通过 LOCK TABLE IN EXCLUSIVE MODE 语句显式获得。这种锁定可以防止其他会话对该表的任何其他锁定。

 

4.事务隔离级别

尽管数据库为用户提供了锁的DML操作方式,但直接使用锁管理是非常麻烦的,因此数据库为用户提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的SQL语句,然后自动为事务操作的数据资源添加适合的锁。此外,数据库还会维护这些锁,当一个资源上的锁数目太多时,自动进行锁升级以提高系统的运行性能,而这一过程对用户来说完全是透明的。

ANSI/ISO SQL 92 标准定义了4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可能导致不同的结果。不同的事务隔离级别能够解决的数据并发问题的能力是不同的,如下表所示:

事务的隔离级别和数据库并发性是对立的。一般来说,使用 READ UNCOMMITED 隔离级别的数据库拥有最高的并发性和吞吐量,而使用 SERIALIZABLE 隔离级别的数据库并发性最低。

SQL 92 定义 READ UNCOMMITED 主要是为了提供非阻塞读的能力。Oracle 虽然也支持  READ  UNCOMMITED,但它不支持脏读;因为 Oracle 使用多版本机制彻底解决了在非阻塞读时读到脏数据的问题并保证读的一致性,所以,Oracle 的 READ COMMITTED 隔离级别就已经满足了 SQL 92 标准的 REPEATABLE READ 隔离级别。

SQL 92 推荐使用 REPEATABLE READ 以保证数据的读一致性,不过用户可以根据应用的需要选择适合的隔离等级。

 

5.JDBC对事务的支持

并不是所有的数据库都支持事务,即使支持事务的数据库也并非支持所有的事务隔离级别。用户可以通过 Connection#getMetaData() 方法获取 DatabaseMetaData 对象,并通过该对象的 supportsTransactions()、supportsTransactionIsoationLevel(int level) 方法查看底层数据库的事务支持情况。

Connection 默认情况下是自动提交的,即每条执行的 SQL 语句都对应一个事务。为了将多条SQL语句当成一个事务执行,必须先通过 Connection#setAutoCommit(false) 阻止 Connection 自动提交,并通过 Connection#setTransactionIsolation() 设置事务的隔离级别。Connection 中定义了对应 SQL 92 标准4个事务隔离级别的常量。通过 Connection#commit() 提交事务,通过 Connection#rollback() 回滚事务。下面是典型的 JDBC事务数据操作的代码,如下图所示。

在 JDBC 2.0 中,事务最终只能有两个操作:提交和回滚。但是,有些应用可能需要对事务进行更多的控制,而不是简单地提交或回滚。JDBC 3.0(Java1.4及以后的版本)引入了一个全新的保存点特性,Savepoint 接口允许用户将事务分割为多个阶段,用户可以指定回滚到事务的特定保存点,而并非像 JDBC 2.0 一样只能回滚到开始事务的点,如下图所示。

下面的代码使用了保存点功能,在发生特定问题时,回滚到指定的保存点,而非回滚整个事务,如下图所示。

并非所有数据库都支持保存点功能,用户可以通过 DatabaseMetaData#supportsSavepoints() 方法查看是否支持。

おすすめ

転載: www.cnblogs.com/jwen1994/p/11291827.html
おすすめ