GlassFish と Logging Last Resource

GlassFish の Logging Last Resource (LLR) はやっぱり WebLogic のものと同じアイディアっぽい.
v2-b43 のコードだと com.sun.jts.CosTransactions.RegisteredResources#distributePrepare() の中で

// laoResource.commit();

というコメントがあります (660 行目).
laoResource というのは Last Resource Commit (LRC) Optimaization のラストリソースのこと.
v2-b42 まではこれはコメントになっておらず,この位置で (prepare することなく) コミットしていました.
その後呼び出し元の com.sun.jts.CosTransactions.TopCordinator#prepare() に戻ってトランザクションログを記録し,第 2 フェーズのコミットが順次行われます.
これは普通の LRC です.


しかし v2-b43 では上記のようにコメントアウトされたため,ラストリソースはコミットされる前に呼び出し元に返ります.
そして呼び出し元の TopCordinator#prepare() には次のコードが加えられています (1850 行目〜).

if (participants.getLAOResource() != null) {
    if (logRecord == null) {
        if (!(LogDBHelper.getInstance().addRecord(
              tranState.localTID.longValue(),
              tranState.globalTID.toTidBytes()))) {
            overallResult = Vote.VoteRollback;
        }
    }        
    if (overallResult != Vote.VoteRollback) {
        participants.getLAOResource().commit();
    }
}

ここでトランザクションログを記録してから,ラストリソースをコミットするわけですね.
もしトランザクションログを記録する DB がラストリソースと同一であれば,そしてそのときに限り,WebLogicLLR と全く同じ動きになります.


っていうか,ログを記録する DB がラストリソースと同じでないとまずくないかこれ?
トランザクションログを記録する DB が JTA なグローバルトランザクションに参加する DataSource でない場合,トランザクションログは AutoCommit モードで INSERT されるように見えます.
つまりログを書いた瞬間にコミット.
その後,もしラストリソースがロールバックされちゃったらどうするんだろ?
例外を拾ったところでトランザクションログを削除しているようには見えないのだけど.


GlassFish v2 のドキュメント (「Administration Guide」の「Configuring Transaction」) には,RDBMSトランザクションログとして使う方法が紹介されてないなぁ.
v3 Prelude の「Administration Guide」には「Configuring Transaction」相当の章が見あたらないし.
あまり使ってほしくないということか?


でもでも,「GlassFish Project - Transactions home page」ってところには説明がある.

<property name="db-logging-resource" value="jdbc/TxnDS"/>

ってプロパティ (どこの?) の値に XA な DataSource を指定すればオッケーぽい.
おそらく SPECj AppServ ではそういう構成にしていたのでしょうね.


特許大丈夫なのかなー?