SlideShare a Scribd company logo
そんなトランザクション
マネージャで大丈夫か?
@takezoen
BizReach,Inc.
JTA、使っていますよね?
● JavaEEサーバ
● Seasar2
● Spring Framework
トランザクションマネージャの役割
● 複数のリソースを1つのトランザクションで処理
する
● トランザクションに参加するリソースの整合性を
保証する
たとえば...
● 複数のDBに対する処理
● DBに対する処理とJMSによるメッセージ送信
DB DB
プログラム
DB MQ
プログラム
参照・更新
メッセージ
送信・受信参照・更新 参照・更新
1トランザクションで処理する
以下のどちらかであることを保証する
● すべてのリソースがコミットされる
● すべてのリソースがロールバックされる
どうやって保証しているのか?
2フェーズコミット
リソース1 リソース2
トランザクション
マネージャ
プログラム
commit
prepare?
commit
prepare?
commit
2フェーズコミット
● 全てのリソースがprepareに対してOKを返した
場合のみcommitする
● どれか1つでもprepareに対してNGを返した場
合は全てのリソースをrollbackする
2フェーズコミット
● XADataSourceが必要
● XADataSourceの実装はJDBCドライバによっ
て提供される
● 非XAリソースをラップしてエミュレーションする
機能を持っている場合もある
XAトランザクションのSQL(MySQLの場合)
mysql> XA START 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO account VALUES(1, 'takezoe');
Query OK, 1 row affected (0.04 sec)
mysql> XA END 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA PREPARE 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA COMMIT 'xatest';
Query OK, 0 rows affected (0.00 sec)
様々な最適化
● リソースが1つの場合は1フェーズでcommitする
● 最後のリソースはprepareせずにcommitする
● 非XAリソースでも1つだけならJTAトランザク
ションに参加可能
めでたしめでたし
ちょっと待った!!
ここからが本題です
途中で落ちたらどうなるの?
不整合が発生してしまう
● リソース側にトランザクションが残ってしまう
● 一部のリソースだけがコミットされた状態になっ
てしまう
リカバリマネージャ
● トランザクションマネージャはトランザクションの
状態をトランザクションログに出力している
● リカバリマネージャはトランザクションログを見て
不正なトランザクションを自動的にリカバリする
リカバリマネージャ
トランザクション
マネージャ
リカバリ
マネージャ
トランザクションログ
トランザクション
の状態を書き込み
残ってしまっている
トランザクションがないか
定期的にチェック
残ってしまっている
トランザクションを検出した
場合はリカバリを実行
誤検出しないよう、トランザクションマネー
ジャの管理下になく、かつ一定時間ステー
タスが変わっていないもの、というような
チェックを行っている
トランザクションのリカバリとは?
● リソース側に残っているトランザクションを
rollbackまたはcommitのどちらかに倒す
● 基本的には安全サイド(rollback)に倒す
● すでに1つでもリソースをcommitしてしまってい
る場合は全部commitする
どこで落ちたかでリカバリ方法が異なる
リソース1 リソース2
トランザクション
マネージャ
プログラム
commit
prepare?
commit
prepare?
commit
ここで落ちた場合は両方
rollbackする
ここで落ちた場合はリソー
ス2をcommitする
リカバリマネージャがあれば安心
リカバリマネージャがあれば安心
ではありません
リカバリマネージャではリカバリ
できないケースがあります
トランザクションログが壊れた場合ヽ(‘ ∇‘ )ノ
● リソースに対する操作を行ってからトランザク
ションログを書き込み前に死んだ場合
● トランザクションログのファイル書き込み中に死
んだ場合
リソース側に残ってしまった
トランザクションを手動でcommitまたは
rollbackする必要があります
手動リカバリ(MySQLの場合)
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 1 | 6 | 0 | xatest |
+----------+--------------+--------------+--------+
1 row in set (0.00 sec)
mysql> XA ROLLBACK 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA RECOVER;
Empty set (0.00 sec)
XAトランザクションが残ってしまって
いる
他のリソースの状態をトランザクショ
ンIDで突き合せてcommitするべき
かrollbackするべきか判断し、トラン
ザクションをリカバリする
残ってしまっていたXAトランザクショ
ンが消えた
めでたしめでたし
ちょっと待った!!
Seasar2やSpringを使っている場合
Seasar2
● トランザクションログを書いていない
● もちろん自動リカバリ機能もない
Seasar2
● なんちゃってXADataSource
<component name="xaDataSource"
class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">"oracle.jdbc.driver.OracleDriver"</property>
<property name="URL">"jdbc:oracle:thin:@xxx:1521:yyy"</property>
<property name="user">"aaa"</property>
<property name="password">"bbb"</property>
</component>
Seasar2のサンプルなどにはこういった設定例が紹介されているが、これは
Seasar2側で用意しているXADataSourceのなんちゃって実装で、通常の java.
sql.ConnectionをラップしてXAの動作をエミュレートするもの。
Seasar2
● 2フェーズコミットを行うのであればJDBCドライバが提供し
ているXADataSourceの実装を使うべき
○ com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
○ org.postgresql.xa.PGXADataSource
<component name="xaDataSource" class="org.postgresql.xa.PGXADataSource">
<property name="serverName">"localhost"</property>
<property name="databaseName">"TEST"</property>
<property name="user">"xxxx"</property>
<property name="password">"xxxx"</property>
</component>
Spring Framework
● 自前ではJTA対応のトランザクションマネージャ
の実装は持っていない
● JTA対応のトランザクションマネージャをSpring
上で使用するためのアダプタが用意されている
● 2フェーズコミットを使用するにはJavaEEサーバ
もしくはスタンドアロンのJTA実装と組み合わせ
て使用する必要がある
2フェーズコミットを行う場合は
APサーバのトランザクションマネージャを
使ったほうが安全です
まとめ
まとめ
● 2フェーズコミットを行う場合、手動でのリカバリが必要にな
るケースが存在するということを意識しておきましょう
● 2フェーズコミットを行う場合はなるべくJavaEEサーバのトラ
ンザクションマネージャを使うことをおすすめします
● そもそも2フェーズコミットを行わなくても済むのであればそ
のほうがよいです
● 分散トランザクションはさらに危険がいっぱいなので近づか
ないようにしましょうw
おわり

More Related Content

PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
分散トレーシング技術について(Open tracingやjaeger)
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
マルチテナントのアプリケーション実装〜実践編〜
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
Redisの特徴と活用方法について
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PPTX
さくっと理解するSpring bootの仕組み
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
分散トレーシング技術について(Open tracingやjaeger)
コンテナの作り方「Dockerは裏方で何をしているのか?」
マルチテナントのアプリケーション実装〜実践編〜
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
Redisの特徴と活用方法について
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
さくっと理解するSpring bootの仕組み

What's hot (20)

PDF
Dockerからcontainerdへの移行
PPTX
マイクロサービスにおける 結果整合性との戦い
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
Javaのログ出力: 道具と考え方
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
イミュータブルデータモデル(入門編)
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
コンテナにおけるパフォーマンス調査でハマった話
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
イミュータブルデータモデルの極意
PDF
できる!並列・並行プログラミング
PDF
GoによるWebアプリ開発のキホン
PDF
君はyarn.lockをコミットしているか?
PDF
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
PPTX
MongoDBが遅いときの切り分け方法
PPTX
RLSを用いたマルチテナント実装 for Django
PDF
JVMのGCアルゴリズムとチューニング
Dockerからcontainerdへの移行
マイクロサービスにおける 結果整合性との戦い
怖くないSpring Bootのオートコンフィグレーション
Javaのログ出力: 道具と考え方
ドメイン駆動設計のための Spring の上手な使い方
イミュータブルデータモデル(入門編)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
マイクロにしすぎた結果がこれだよ!
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
コンテナにおけるパフォーマンス調査でハマった話
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
イミュータブルデータモデルの極意
できる!並列・並行プログラミング
GoによるWebアプリ開発のキホン
君はyarn.lockをコミットしているか?
CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021
MongoDBが遅いときの切り分け方法
RLSを用いたマルチテナント実装 for Django
JVMのGCアルゴリズムとチューニング
Ad

Viewers also liked (20)

PDF
small 画面でも、 BIG 画面でも、 今すぐ使えるレスポンシブ活用術
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
PDF
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
PPTX
ゲームエンジニアのためのデータベース設計
PDF
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
PDF
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
PDF
ソーシャルゲームのためのデータベース設計
PDF
第2回関西ソーシャルゲーム勉強会
ODP
HTML5概要、コードサンプル
PDF
クラウド・SaaS型 統合基幹業務システム 「CAM MACS」を支える PostgreSQL ~雲に乗ったゾウ~
PDF
業務系WebアプリケーションがStrutsから旅立つ日
PPTX
レベルを上げて物理で殴れ、Fuzzing入門 #pyfes
PPTX
ソーシャルゲームにレコメンドエンジンを導入した話
PPTX
Serverspec at hbstudy #45
PDF
Scala界隈の近況
PDF
PG-REXで学ぶPacemaker運用の実例
KEY
実録!Railsのはまりポイント10選
PDF
MySQL Index勉強会外部公開用
PDF
Doma SQLテンプレートのしくみ
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
small 画面でも、 BIG 画面でも、 今すぐ使えるレスポンシブ活用術
ソーシャルゲーム案件におけるDB分割のPHP実装
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
ゲームエンジニアのためのデータベース設計
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
ソーシャルゲームのためのデータベース設計
第2回関西ソーシャルゲーム勉強会
HTML5概要、コードサンプル
クラウド・SaaS型 統合基幹業務システム 「CAM MACS」を支える PostgreSQL ~雲に乗ったゾウ~
業務系WebアプリケーションがStrutsから旅立つ日
レベルを上げて物理で殴れ、Fuzzing入門 #pyfes
ソーシャルゲームにレコメンドエンジンを導入した話
Serverspec at hbstudy #45
Scala界隈の近況
PG-REXで学ぶPacemaker運用の実例
実録!Railsのはまりポイント10選
MySQL Index勉強会外部公開用
Doma SQLテンプレートのしくみ
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Ad

More from takezoe (20)

PDF
Journey of Migrating Millions of Queries on The Cloud
PDF
GitBucket: Open source self-hosting Git server built by Scala
PDF
Testing Distributed Query Engine as a Service
PDF
Revisit Dependency Injection in scala
PDF
How to keep maintainability of long life Scala applications
PDF
頑張りすぎないScala
PDF
GitBucket: Git Centric Software Development Platform by Scala
PDF
Non-Functional Programming in Scala
PDF
Scala警察のすすめ
PDF
Scala製機械学習サーバ「Apache PredictionIO」
PDF
The best of AltJava is Xtend
PDF
Scala Warrior and type-safe front-end development with Scala.js
PDF
Tracing Microservices with Zipkin
PDF
Type-safe front-end development with Scala
PDF
Scala Frameworks for Web Application 2016
PDF
Macro in Scala
PDF
Java9 and Project Jigsaw
PDF
Reactive database access with Slick3
PDF
markedj: The best of markdown processor on JVM
PDF
ネタじゃないScala.js
Journey of Migrating Millions of Queries on The Cloud
GitBucket: Open source self-hosting Git server built by Scala
Testing Distributed Query Engine as a Service
Revisit Dependency Injection in scala
How to keep maintainability of long life Scala applications
頑張りすぎないScala
GitBucket: Git Centric Software Development Platform by Scala
Non-Functional Programming in Scala
Scala警察のすすめ
Scala製機械学習サーバ「Apache PredictionIO」
The best of AltJava is Xtend
Scala Warrior and type-safe front-end development with Scala.js
Tracing Microservices with Zipkin
Type-safe front-end development with Scala
Scala Frameworks for Web Application 2016
Macro in Scala
Java9 and Project Jigsaw
Reactive database access with Slick3
markedj: The best of markdown processor on JVM
ネタじゃないScala.js

そんなトランザクションマネージャで大丈夫か?