[seasar-dotnet:333] Re: [Seasar]TransactionContextのIsolationLevelの指定方法

kubo jazzflute @ mbn.nifty.com
2006年 9月 7日 (木) 11:24:41 JST


久保です。

> > これは、SiteのDocumentを直すかSourceを直すかしないといけないような
> > 気がします。
> > (結構、みんなCopyして使っているのでSourceを直す方が影響が
> >  少ないでしょうか???)
> 
> おぉっ・・orz
> 久保さん、ありがとうございます。m(_ _)m
> 
> 確かにSourceのプロパティ名をIsolationLevelにかえた方が良さそうですね。

杉本さん...続きがありました。。。


<property name="Level"> に変えてやってみたら、
確かにDiconに定義したTransactionContextには{Snapshot}が格納された
のですが(Logで確認)、TransactionContextって。。。

Diconに定義されているTransactionContext:
  →LocalRequiredTxのContextにInjectionされる。

LocalRequiredTxで利用するTransactionContext:
  →InjectされたTransactionContextのCreate()の戻り値の
    TransactionContextを利用する。(毎回newする)

とソースから読み取れるのですが間違ってないでしょうか!?!?
すると、Create()の中で毎度 new されるTransactionContextは、
誰も{Level}プロパティをSetしないので、デフォルトのReadCommittedに
なります。なので、DiconでIsolationLevelを指定しても実際の
Transactionには反映されていないようです(実際にLock掛けたりして試した)。

TransactionContext#Create()を以下のように直したら指定した
トランザクション分離レベルがトランザクションに反映されました。

public ITransactionContext Create()
{
	TransactionContext ctx = new TransactionContext(this.slot);
	ctx.dataSource = this.dataSource;
	ctx.Level = this.Level; // ★ここを付け足した
	return ctx;
}

ちょっとこれでいいのかわからないですが、報告しておきます。




#
# SQLServer2005の読み取り一貫性は、結局...
# alter database XXX set READ_COMMITTED_SNAPSHOT on を設定して、
# TransactionはReadCommittedのままで、Oracleとほぼ同じ動作を
# するようなので、Diconに分離レベルを指定する必要はなくなりました。
# (分離レベルSnapshotはまたちょっと違う動きをします)
#

-- 
kubo <jazzflute @ mbn.nifty.com>




seasar-dotnet メーリングリストの案内