Springトランザクション独立性レベルと伝播メカニズム、spring+mybatis+atomikos分散トランザクション管理を実現
本文は本人の別のブログに転載した.http://blog.csdn.net/liaohaojian/article/details/68488150】
1.トランザクションの定義:トランザクションとは、複数の操作ユニットからなる集合を指し、複数のユニット操作は全体的に分割できないか、操作が成功しないか、成功しているかのいずれかです.4つの原則(ACID)に従う必要があります.原子性(Atomicity):すなわち、トランザクションは分割できない最小作業ユニットであり、トランザクション内の操作はすべて行うか、すべてしないか. コンシステンシ(Consistency):トランザクションの実行前にデータベースのデータが正しい状態にあり、トランザクションの実行が完了した後もデータベースのデータが正しい状態にあるべきである.すなわち、データ整合性制約が破壊されていない.銀行が振り替え、AがBに振り替えた場合、Aのお金が必ずBに振り替えられることを保証しなければならない.Aのお金が振り替えられたが、Bが受け取っていないことはない.そうしないと、データベースのデータが一致しない(正しくない)状態になる. 独立性(Isolation):同時トランザクションの実行間は相互に影響しません.1つのトランザクション内の操作は他のトランザクションに影響しません.これは、独立性を指定するためにトランザクション独立性レベルが必要です. 持続性(Durability):トランザクションが成功すると、データベースのデータの変更は永続的でなければなりません.たとえば、システム障害や停電によるデータの不一致や損失は発生しません.
2.取引のタイプデータベースは、ローカルトランザクションとグローバルトランザクション に分かれています.ローカルトランザクション:通常トランザクション、独立したデータベースで、そのデータベース上で動作するACIDを保証します. 分散トランザクション:2つ以上のデータベース・ソースに関連するトランザクション、すなわち、複数の同類または異種のデータベースにまたがるトランザクション(各データベースのローカル・トランザクションからなる)であり、分散トランザクションは、これらのローカル・トランザクションのすべての操作のACIDを保証し、複数のデータベースにまたがるトランザクションを可能にすることを目的とする.
JavaトランザクションタイプはJDBCトランザクションとJTAトランザクションに分けられます JDBCトランザクション:前述のデータベーストランザクションのローカルトランザクションをconnectionオブジェクト制御で管理します. JTAトランザクション:JTAはJavaトランザクションAPI(Java Transaction API)を指し、Java EEデータベーストランザクション仕様であり、JTAはトランザクション管理インタフェースのみを提供し、WebSphere Application Serverなどのアプリケーションサーバメーカーによって実現され、JTAトランザクションはJDBCよりも強く、分散トランザクションをサポートする.
プログラミングによって宣言トランザクションとプログラミングトランザクションに分けるかどうか、参照http://blog.csdn.net/liaohaojian/article/details/70139151宣言トランザクション:XML構成または注釈によって実装されます. プログラミングトランザクション:プログラミングコードによってビジネスロジックが必要なときに自分で実現され、粒度がより小さい.
3.Springトランザクション独立性レベル:springにはTransactionDefinitionインタフェースで定義される5つの独立性レベルがあります.ソースコードを見て分かるように、その黙isolation_default(最下位データベースのデフォルトレベル)では、他の4つの独立性レベルがデータベースの独立性レベルと一致します. ISOLATION_DEFAULT:下位データベースのデフォルトの独立性レベルで、データベース管理者が何を設定するか ISOLATION_READ_UNCOMMITTED(コミットされていない読み取り):最も低い独立性レベル、トランザクションがコミットされていない前に、他のトランザクションによって読み取ることができます(幻、汚れた読み取り、重複しない読み取りが発生します) ISOLATION_READ_COMMITTED(コミットリード):1つのトランザクションがコミットされた後に他のトランザクションによって読み取られる(この独立性レベルでは、他のトランザクションがコミットされていないトランザクションのデータを読み取ることは禁止されているため、幻の読み取り、重複しない読み取りをもたらす)、sql serverのデフォルトレベル ISOLATION_REPEATABLE_READ(リピート可能):リピート可能で、複数回の読み取り内容が一致することを保証し、他のトランザクションにコミットされていないデータの読み取りを禁止する(この隔離は基本的に汚れた読み取りを防止し、リピートできない(修正に重点を置いている)が、幻読み(増加と削除に重点を置いている)(MySql暗黙レベル、変更はset transaction isolation levelレベルを通過することができる) . ISOLATION_SERIALIZABLE(シーケンス化):最もコストの高い信頼性の高い独立性レベル(汚れた読み取り、重複しない読み取り、幻の読み取りを防止) 更新が失われました.2つのトランザクションが同時に1行のデータを更新すると、最後のトランザクションの更新が最初のトランザクションの更新を上書きし、最初のトランザクションの更新のデータが失われます.これは、ロックがかかっていないためです. 幻読:同じトランザクション操作中に、異なる期間に複数回(異なるトランザクション)同じデータが読み出され、読み出された内容が一致しない(一般的には行数が多くなるか少なくなる). ダーティ・リード:1つのトランザクションが、別のトランザクションに言及されていないコンテンツ、すなわちダーティ・リードに読み出されます. 繰り返し不可:同じトランザクションでは、複数回の読み取り内容が一致しません(一般行数は変わらず、内容は変わります).
幻の読み取りと再読み取り不可の違い:幻の読み取りの重点は挿入と削除にある.すなわち、2回目のクエリは、1回目のクエリよりもデータが少なくなったり、多くなったりして、幻のように見えるが、再読み取り不可の重点は修正にある.すなわち、2回目のクエリは、1回目のクエリよりもクエリ結果が一致していないこと、すなわち、1回目の結果が再現できないことを発見する.
データベース・アイソレーション・レベルが高いほど、実行コストが高くなり、同時実行能力が低下するため、実際のプロジェクト開発では、同時パフォーマンスを考慮するためにコミット・リード・アイソレーション・レベルを使用するのが一般的です.重複しない読み取りや幻の読み取りは避けられませんが、更新や汚れた読み取りを失うことを避けることができます.しかし、これらの問題は、悲観的ロックまたは楽観的ロックを使用して、発生する可能性のある場合に解決することができる.
悲観的なロックと楽観的なロックは参考になります.http://blog.csdn.net/liaohaojian/article/details/62416972
4.伝播行為:7大伝播行為があり、TransactionDefinitionインタフェースで定義されている. PROPAGATION_REQUIRD:現在のトランザクションをサポートします.現在のトランザクションがない場合は、新しいトランザクションを作成します. PROPAGATION_SUPPORTS:現在のトランザクションをサポートし、現在トランザクションがない場合は非トランザクションで実行されます(ソースコードに注意点が提示されていますが、よく見えません.後で検討してください). PROPAGATION_MANDATORY:現在のトランザクションをサポートし、現在トランザクションがない場合は例外を放出します(既存のトランザクションで必ず実行し、ビジネス・メソッドは独自のトランザクションを開始できません). PROPAGATION_REQUIRES_NEW:常に新しいトランザクションを作成し、現在のトランザクションがある場合は元のトランザクションを保留します. PROPAGATION_NOT_SUPPORTED:現在のトランザクションはサポートされておらず、現在のトランザクションが存在する場合は、トランザクションが保留されます. PROPAGATION_NEVER:現在のトランザクションはサポートされていません.現在のトランザクションが存在する場合、例外が発生します. PROPAGATION_NESTED:現在のトランザクションが存在する場合はネストされたトランザクションで実行し、現在トランザクションが存在しない場合はPROPACATION_と実行します.REQUIRDと同様の動作(注意:JDBCに適用される場合、JDBC 3.0以上の駆動のみが適用されます).
5.Springトランザクションのサポート
1.springには、異なるデータ・ソースをサポートする内蔵トランザクション・マネージャが多数用意されています.よく見られるのは3つあります DataSourceTransactionManager:org.springframework.jdbc.datasourceパッケージの下、データソーストランザクション管理クラスは、JDBC、Mybatisフレームワークトランザクション管理に使用される限り、単一javax.sql.DataSourceデータソースのトランザクション管理を提供します. HibernateTransactionManager:org.springframework.orm.hibernate 3パッケージの下で、データソーストランザクション管理クラスは、Hibernateフレームワークを統合する際のトランザクション管理のための単一org.hibernate.SessionFactoryトランザクションサポートを提供します.注意:このトランザクションマネージャはHibernate 3+バージョンのみをサポートし、Spring 3.0+バージョンはHibernate 3.2+バージョンのみをサポートします. JtaTransactionManager:org.springframework.transaction.jtaパッケージにあり、分散トランザクション管理のサポートを提供し、Java EEアプリケーションサーバにトランザクション管理を委任するか、ローカルJTAトランザクションマネージャをカスタマイズしてアプリケーションにネストします.
ビルトイン・トランザクション・マネージャは抽象クラスA b s t r actPlatformTransactionManagerを継承し、A b s t r actPlatformTransactionManagerはインタフェースPlatformTransactionManagerを継承します.
Springフレームワークがトランザクション管理をサポートする核心はトランザクションマネージャ抽象であり、異なるデータアクセスフレームワークに対してポリシーインタフェースPlatformTransactionManagerを実現することで、マルチクロックデータアクセスフレームワークのトランザクション管理をサポートすることができる.
PlatformTransactionManagerインタフェースの定義は次のとおりです.
TransactionDefinitionインタフェースの定義は次のとおりです.
TransactionStatusインタフェースの定義は次のとおりです.
2.Spring分散トランザクション構成は、アプリケーションサーバ(Tomcatなど)のJNDIデータソースを参照し、アプリケーションサーバ に依存するJTAトランザクション管理を間接的に実現する.直接集積JOTM(公式サイト:http://jotm.objectweb.org/)、Atomikos(公式サイト:https://www.atomikos.com/)JTAトランザクション管理(ユニットテストでよく使用されるアプリケーションサーバサポートなし) アプリケーションサーバ固有のトランザクションマネージャを使用し、JTAトランザクションの高度な機能(Weblogic,Websphere) を使用します.
1).アプリケーションサーバ(Tomcatなど)のJNDIデータソースを参照し、間接的にJTAトランザクション管理を実現し、以下のように構成する
2)Atomikosを使用して分散トランザクション管理を行い、以下のように構成します.
atomikosに必要なパッケージおよび関連プロファイルのダウンロードパス:http://download.csdn.net/detail/liaohaojian/9810401ファイルjta.propertiesファイルがclasspathルートディレクトリの下に配置されます.
1.トランザクションの定義:トランザクションとは、複数の操作ユニットからなる集合を指し、複数のユニット操作は全体的に分割できないか、操作が成功しないか、成功しているかのいずれかです.4つの原則(ACID)に従う必要があります.
2.取引のタイプ
JavaトランザクションタイプはJDBCトランザクションとJTAトランザクションに分けられます
プログラミングによって宣言トランザクションとプログラミングトランザクションに分けるかどうか、参照http://blog.csdn.net/liaohaojian/article/details/70139151
3.Springトランザクション独立性レベル:springにはTransactionDefinitionインタフェースで定義される5つの独立性レベルがあります.ソースコードを見て分かるように、その黙isolation_default(最下位データベースのデフォルトレベル)では、他の4つの独立性レベルがデータベースの独立性レベルと一致します.
幻の読み取りと再読み取り不可の違い:幻の読み取りの重点は挿入と削除にある.すなわち、2回目のクエリは、1回目のクエリよりもデータが少なくなったり、多くなったりして、幻のように見えるが、再読み取り不可の重点は修正にある.すなわち、2回目のクエリは、1回目のクエリよりもクエリ結果が一致していないこと、すなわち、1回目の結果が再現できないことを発見する.
データベース・アイソレーション・レベルが高いほど、実行コストが高くなり、同時実行能力が低下するため、実際のプロジェクト開発では、同時パフォーマンスを考慮するためにコミット・リード・アイソレーション・レベルを使用するのが一般的です.重複しない読み取りや幻の読み取りは避けられませんが、更新や汚れた読み取りを失うことを避けることができます.しかし、これらの問題は、悲観的ロックまたは楽観的ロックを使用して、発生する可能性のある場合に解決することができる.
悲観的なロックと楽観的なロックは参考になります.http://blog.csdn.net/liaohaojian/article/details/62416972
4.伝播行為:7大伝播行為があり、TransactionDefinitionインタフェースで定義されている.
5.Springトランザクションのサポート
1.springには、異なるデータ・ソースをサポートする内蔵トランザクション・マネージャが多数用意されています.よく見られるのは3つあります
ビルトイン・トランザクション・マネージャは抽象クラスA b s t r actPlatformTransactionManagerを継承し、A b s t r actPlatformTransactionManagerはインタフェースPlatformTransactionManagerを継承します.
Springフレームワークがトランザクション管理をサポートする核心はトランザクションマネージャ抽象であり、異なるデータアクセスフレームワークに対してポリシーインタフェースPlatformTransactionManagerを実現することで、マルチクロックデータアクセスフレームワークのトランザクション管理をサポートすることができる.
PlatformTransactionManagerインタフェースの定義は次のとおりです.
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;// ( TransactionDefinition ), TransactionStatus , TransactionException( ) 。
void commit(TransactionStatus status) throws TransactionException;// TransactionStatus 。
void rollback(TransactionStatus status) throws TransactionException;// TransactionStatus 。
}
TransactionDefinitionインタフェースの定義は次のとおりです.
public interface TransactionDefinition {
int getPropagationBehavior(); //
int getIsolationLevel(); //
int getTimeout(); //
boolean isReadOnly(); //
String getName(); //
}
TransactionStatusインタフェースの定義は次のとおりです.
public interface TransactionStatus extends SavepointManager {
boolean isNewTransaction(); //
boolean hasSavepoint(); //
void setRollbackOnly(); //
boolean isRollbackOnly(); //
void flush(); // , Hibernate/JPA , JDBC ;
boolean isCompleted(); //
}
2.Spring分散トランザクション構成
1).アプリケーションサーバ(Tomcatなど)のJNDIデータソースを参照し、間接的にJTAトランザクション管理を実現し、以下のように構成する
2)Atomikosを使用して分散トランザクション管理を行い、以下のように構成します.
classpath:public.properties
${db.jdbcUrlOne}
${user}
${password}
${db.jdbcUrlTwo}
${user}
${password}
org.springframework.web.servlet.view.InternalResourceView
/
.jsp
no
105,179,90
red
200
60
80
code
4
, ,
atomikosに必要なパッケージおよび関連プロファイルのダウンロードパス:http://download.csdn.net/detail/liaohaojian/9810401ファイルjta.propertiesファイルがclasspathルートディレクトリの下に配置されます.