[Seasar-user:3134] Re: S2Tx 機能を使用した場合のロックについて
Yasuo Higa
higa
2006年 2月 2日 (木) 17:31:23 JST
<[E-MAIL ADDRESS DELETED]> の、
"[Seasar-user:3133] S2Tx 機能を使用した場合のロックについて" において、
"?橋透友<[E-MAIL ADDRESS DELETED]>"さんは書きました:
ひがです。
> 高橋と申します。
> はじめて投稿させていただきます。
>
> S2Tx機能を使用した場合のテーブルの行ロックで下記現象が発生しています。
> この現象についての解決方法をご存知の方がいらっしゃいましたら、
> ご教授願います。
>
>
> -----------------------------------------------------------------
> ○環境
> ・JDK:1.4.2_03
> ・S2Container:2.2.10
> ・S2Dao:1.0.27
> ・DB:Microsoft SQL Server
>
>
> ○現象
> 『トランザクション属性にj2ee.requiredTxをAspectしたクラスから、
> テーブルの行ロックをかけようとしたところ、
> 行ロックではなく、テーブルロックになる。』
>
>
> テーブルの行ロックをかけるため下記SQLを実行し、
> 「SQL Server Enterprise Manager」からロック状況を確認したところ、
> テーブル内の全レコードに対して更新ロックがかかります。
>
> SELECT * FROM テーブル名 with(UPDLOCK,ROWLOCK)
> WHERE aaaa = 'aa';
> ※aaaa:プライマリキー
>
> S2Tx機能をはずした状態
> (BEGIN TRANSACTION、COMMIT TRANSACTIONを使用した場合)で同一SQLを実行した
> ところ、
> 対象行にのみ更新ロックがかかっていることことから、
> S2Tx機能に原因があるのではと考えています。
>
S2Txは、ロックには関与していないので、
with(UPDLOCK,ROWLOCK)を使うには、明示的に、
BEGIN TRANSACTION、COMMIT TRANSACTIONを行う必要がある
ということだと思います。
XAに対応したJDBC Driverならそっちを使ってみるのも手です。
j2ee.diconのxaDataSourceの部分をそのXA Driverの物に替えればよいです。
ただ、まともなXA Driverを見たことが余り無いので、
期待できないかも。
S2Txは、JTAの仕様に合わせて、XAResourceのメソッドを呼び出しています。
dbcp.implのDBXAResourceのdoBegin, doCommitなどを見れば、
実際に何が行われているのかが分かります。
DBXAResourceを修正して、doBegin, doCommitで
BEGIN TRANSACTION、COMMIT TRANSACTIONを行うようにするとどうなりますか。
Yasuo Higa
The Seasar Foundation
Seasar-user メーリングリストの案内