Movatterモバイル変換


[0]ホーム

URL:


Uploaded bytakezoe
24,922 views

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

Embed presentation

Downloaded 56 times
そんなトランザクションマネージャで大丈夫か?@takezoenBizReach,Inc.
JTA、使っていますよね?● JavaEEサーバ● Seasar2● Spring Framework
トランザクションマネージャの役割● 複数のリソースを1つのトランザクションで処理する● トランザクションに参加するリソースの整合性を保証する
たとえば...● 複数のDBに対する処理● DBに対する処理とJMSによるメッセージ送信DB DBプログラムDB MQプログラム参照・更新メッセージ送信・受信参照・更新 参照・更新1トランザクションで処理する
以下のどちらかであることを保証する● すべてのリソースがコミットされる● すべてのリソースがロールバックされる
どうやって保証しているのか?
2フェーズコミットリソース1 リソース2トランザクションマネージャプログラムcommitprepare?commitprepare?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トランザクションマネージャプログラムcommitprepare?commitprepare?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
おわり

Recommended

PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
イミュータブルデータモデル(世代編)
PPTX
イベント・ソーシングを知る
PPTX
MongoDBが遅いときの切り分け方法
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
PDF
ストリーム処理を支えるキューイングシステムの選び方
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
PDF
Javaのログ出力: 道具と考え方
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
PPTX
iostat await svctm の 見かた、考え方
PPTX
Spring Boot ユーザの方のための Quarkus 入門
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
Fluentdのお勧めシステム構成パターン
PPT
Glibc malloc internal
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
PDF
small 画面でも、 BIG 画面でも、 今すぐ使えるレスポンシブ活用術
PDF
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事

More Related Content

PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
PDF
イミュータブルデータモデル(世代編)
PPTX
イベント・ソーシングを知る
PPTX
MongoDBが遅いときの切り分け方法
PDF
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
PDF
ストリーム処理を支えるキューイングシステムの選び方
アーキテクチャから理解するPostgreSQLのレプリケーション
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
イミュータブルデータモデル(世代編)
イベント・ソーシングを知る
MongoDBが遅いときの切り分け方法
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
[社内勉強会]ELBとALBと数万スパイク負荷テスト
ストリーム処理を支えるキューイングシステムの選び方

What's hot

PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PDF
マイクロにしすぎた結果がこれだよ!
PDF
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
PDF
Javaのログ出力: 道具と考え方
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
ソーシャルゲーム案件におけるDB分割のPHP実装
PPTX
iostat await svctm の 見かた、考え方
PPTX
Spring Boot ユーザの方のための Quarkus 入門
PDF
Spring Boot × Vue.jsでSPAを作る
PDF
Fluentdのお勧めシステム構成パターン
PPT
Glibc malloc internal
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
コンテナ未経験新人が学ぶコンテナ技術入門
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
マイクロにしすぎた結果がこれだよ!
Azure Database for PostgreSQL 入門 (PostgreSQL Conference Japan 2021)
Javaのログ出力: 道具と考え方
怖くないSpring Bootのオートコンフィグレーション
PlaySQLAlchemy: SQLAlchemy入門
ソーシャルゲーム案件におけるDB分割のPHP実装
iostat await svctm の 見かた、考え方
Spring Boot ユーザの方のための Quarkus 入門
Spring Boot × Vue.jsでSPAを作る
Fluentdのお勧めシステム構成パターン
Glibc malloc internal
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
マルチテナント化で知っておきたいデータベースのこと
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~

Viewers also liked

PDF
small 画面でも、 BIG 画面でも、 今すぐ使えるレスポンシブ活用術
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、オンラインバックアップの仕組み)
PPTX
My sqlで2億件のシリアルデータと格闘した話
small 画面でも、 BIG 画面でも、 今すぐ使えるレスポンシブ活用術
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
ゲームエンジニアのためのデータベース設計
大規模ソーシャルゲーム開発から学んだ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、オンラインバックアップの仕組み)
My sqlで2億件のシリアルデータと格闘した話

More from takezoe

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

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


[8]ページ先頭

©2009-2025 Movatter.jp