問題
1.トランザクションとは何ですか?
2.取引の目的は何ですか?
データベーストランザクション
Springの基礎となるトランザクション管理はデータベーストランザクションに基づいているため、Springトランザクションを学ぶ前に、まずデータベーストランザクションを学ぶ必要があります。
トランザクションの定義
トランザクションは、データベース管理システムの実行プロセスにおける論理単位であり、限られた一連のデータベース操作で構成されます。(ウィキペディアから)
単純な変換とは、データリソースにアクセスする段階的な操作を操作全体に結合することであり、この実行単位全体がトランザクションです。
取引の目的
トランザクションの目的は、データの整合性を確保することです。
取引の特徴
ステップバイステップの操作が、全体の操作、全体の成功、または全体の失敗(同じ生と死)に確実に結合されるようにするため。厳密な定義が必要です。
トランザクション(ACID)の4つの特性:原子性(原子性)、整合性(整合性)、分離(IsoLation)、耐久性(耐久性)。
- 原子性:同じトランザクションの複数の操作は分割できない最小単位です。すべての操作が正常に実行されると、トランザクションが送信されます。それ以外の場合は、成功したすべての操作がキャンセルされ、データベースが初期状態に復元されます。
- 一貫性:トランザクションが送信された後、データ結果はビジネスの期待ルールと一致します。たとえば、トランザクションが正常に送信されたかどうかに関係なく、2つのアカウントの合計は変更されません。
- 分離:トランザクションと並行操作中のトランザクションの間には分離があり、それらは相互に干渉しません。分離はデータベースの分離レベルに依存します。
- 永続性:トランザクションが正常に送信された後、トランザクションの一連の操作がデータベースに永続化されます。
トランザクション分離レベル
- コミットされていない読み取り:トランザクションは、コミットされていない別のコンテンツを読み取ることができます。「ダーティリード」、「繰り返し不可のリード」、「ファントムリード」がある場合があります。
- コミットの読み取り:トランザクションは、正常に送信された別のデータのコンテンツのみを読み取ることができます。「繰り返し不可の読み」と「幻の読み」があるかもしれません。ほとんどのデータベースのデフォルトの分離レベル
- 繰り返し読み取り:トランザクション全体で同じデータが複数回読み取られます。「マジックリーディング」が出ることがあります。Mysqlのデフォルトレベル。
- シリアライゼーション:すべてのトランザクション操作は順番に実行する必要があります。最も厳密な分離レベル。
データの同時実行の問題
- ダーティリード:トランザクション1はデータを更新しますが、コミットされませんが、トランザクション2はコミットされていないコンテンツを読み取ることができます。トランザクションがコミットされていないデータをロールバックすると、トランザクション2は前に読み取ります。
- 繰り返し不可の読み取り:同じトランザクションが同じデータを複数回読み取り、各読み取りの結果は異なります。トランザクション1は、トランザクション2の更新操作の前後でデータを読み取り、2つの結果は異なります。
- マジックリード:同じトランザクションが同じデータセットに対して複数のクエリを実行し、結果セットは毎回異なります。トランザクション1 はトランザクション2の挿入または削除操作の前後のデータを読み取り、操作の結果セットは異なります。
ダーティリードの理由:「選択」操作は制限されていません
繰り返し不可の読み取りの理由:「更新」操作は制限されていません
ファントム読み取りの理由:「挿入」および「削除」操作は制限されていません
データ並行性の問題に対するトランザクション分離レベルの影響
- コミットされていない役割を読み取る:影響なし。
- 読み取りの提出:「スナップショット読み取り」を使用すると、「ダーティー読み取り」を回避できますが、「繰り返し不可の読み取り」および「ファントム読み取り」を回避できません。
- 反復可能読み取り:「ダーティー読み取り」および「反復不能読み取り」を回避するために「スナップショット読み取り」を使用しますが、「マジック読み取り」は使用しません。
- シリアライゼーション:「ダーティリード」、「繰り返し不可のリード」、「ファントムリード」を回避できます。
スナップショット読み取り
スナップショットの読み取りは、MVCCと取り消しログの実装に基づいており、単純な選択ステートメントに適しています。MVCCの同時バージョン管理は、ReadView(トランザクションビュー)によって実現されます。
読み取りが送信されました:トランザクションの各SQLはReadViewを生成します。最新のReadViewの値は、クエリ操作中に読み取られます。
繰り返し可能な読み取り:トランザクションの開始時にReadViewが生成されます。トランザクション内の複数のSQLが同じReadViewを読み取ります。同じReadViewの値は、複数のSQLクエリでも読み取られます。
春のトランザクション管理
Springは、トランザクション管理用の統合プログラミングテンプレートを提供し、高レベルで統合トランザクションの抽象化を確立します。
トランザクション管理インターフェース
TransactionDefinition
これは、トランザクションの分離レベル、タイムアウト期間、読み取りトランザクションかどうか、トランザクションの伝播規則など、トランザクションの特定の属性を説明するために使用されます。
トランザクション分離レベル
TransactionDefinitionでは、分離レベルを表す5つの定数が定義されています。
(1)TransactionDefinition.ISOLATION_DEFAULT。これは、データベースのデフォルトの分離セクターが使用されることを意味します(Oracleは読み取りサブミットを使用し、Mysqlはデフォルトで繰り返し可能な読み取りを使用します)
(2)TransactionDefinition.ISOLATION_READ_UNCOMMITTED、読み取りが送信されていないことを示します。
(3)TransactionDefinition.ISOLATION_READ_COMMITTED。読み取りと送信を意味します。
(4)TransactionDefinition.ISOLATION_REPEATABLE_READ。繰り返し読み取ることができます。
(5)TransactionDefinition.ISOLATION_SERIALIZABLE、つまりシリアル化を意味します。
トランザクション伝搬動作
トランザクションが別のトランザクションによって呼び出された場合、トランザクションの伝播を指定する必要があります。
TransactionDefinition.PROPAGATION_REQUIRED。現在トランザクションがある場合は、トランザクションに参加します。トランザクションがない場合は、新しいトランザクションを作成します。これが最も一般的な選択肢です。
TransactionDefinition.PROPAGATION_SUPPORTS、現在トランザクションがある場合はトランザクションに参加し、トランザクションがない場合は非トランザクション的な方法で実行を続けます。
TransactionDefinition.PROPAGATION_MANDATORY、現在トランザクションがある場合はトランザクションに参加し、現在トランザクションがない場合は例外をスローします。
トランザクションのタイムアウト
トランザクションの実行が許可されている時間を超えると、指定した時間内にトランザクションが完了しない場合、トランザクションは自動的にロールバックされます。TransactionDefinitionのデフォルトの単位は秒です。
読み取り専用ステータス
トランザクションはトランザクションリソースを読み取るだけで、データは変更しません。トランザクションリソースデータのみを読み取る場合は、それを読み取り専用状態に設定して、実行パフォーマンスを向上させることができます。
ロールバックルール
ロールオーバーではなくロールバックの対応する例外を定義するために使用されます。デフォルトでは、トランザクションは、実行時に特定の例外が発生した場合にのみロールバックされます。
TransactionStatus
トランザクションの特定の実行ステータスを示すために使用されます。トランザクションマネージャーは、このインターフェイスを通じてトランザクションランタイムのステータス情報を取得できます。また、このインターフェイスを通じてトランザクションを間接的にロールバックすることもできます。これは、例外がスローされたときにトランザクションをロールバックするよりも意味があります。
PlatformTransactionManager
トランザクションマネージャーは、トランザクションのコミット、ロールバックを提供し、既存のトランザクションを返すか、トランザクション定義情報に従ってトランザクション環境から新しいトランザクションを作成します。
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
参考資料
[1] https://zh.wikipedia.org/wiki/データベーストランザクション
[2] https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc
[3] https://www.cnblogs.com/AlmostWasteTime/p/11466520.html
[4] https://juejin.im/post/5b00c52ef265da0b95276091
[5]「Spring4.xエンタープライズアプリケーション開発の戦闘をマスターする」