XAによる2フェーズコミット

昨日MySQLでは"XA END xid SUSPEND"をまだ実装していないのではないか,しかし一方でJBossはこれを発行する,どうしよう,と書いたと思います.

某筋からの情報によれば,確かにMySQLでは"XA END"の派生系はまだ実装されていません.Connector/Jが先に実装していただけのようです.

しかし回避策も存在することがわかりました.以下の設定をJBossのデータソースに追加します.

<track-connection-by-tx>true</track-connection-by-tx>

これによってとりあえずJBossはエラーをはかなくなり,データソース(MySQL)のデプロイも無事行うことができました.

JBoss Guide 4.0 より

track-connection-by-tx: Specifying a true value for this element makes the connection manager keep an xid to connection map and only put the connection back in the pool when the transaction completes and all the connection handles are closed or disassociated (by the method calls returning). As a side effect, we never suspend and resume the xid on the connection's XAResource. This is the same connection tracking behavior used for local transactions.

この値をtrueに設定するとconnection managerはxidでconnectionを追跡するようになり,SUSPENDは発行されなくなる.ということらしいです.詳細はまだ理解していません.

MySQLのGeneral logはこんな感じになりました.

1 Query       XA START 0x6d697234322f323033,0x31,0x101
1 Prepare     [172] SELECT COUNT(*) FROM tableB WHERE message=?
1 Execute     [172] SELECT COUNT(*) FROM tableB WHERE message=?
1 Prepare     [173] INSERT INTO tableB (message) VALUES (?)
1 Execute     [173] INSERT INTO tableB (message) VALUES (?)
1 Query       XA END 0x6d697234322f323033,0x31,0x101
1 Query       XA COMMIT 0x6d697234322f323033,0x31,0x101 ONE PHASE

"XA PREPARE"を使わずに"XA COMMIT xid ONE PHASE"となってますのでちょっと「あれ?」という感じですが,続きはまた後ほど.



追記
local-tx-datasourceからxa-datasouceに変えただけで他はまったくいじってませんが,体感でパフォーマンスが50%くらいに低下したような・・・.同時に処理をさせるスレッド数を増やすことである程度解消できそうですが.