DEKOさん、ありがとうございます。
渡辺です。
その後調べてみたのですが、
autoCommitは、autoStartのときに有効なプロパティなのですが、
そもそもautoStart自体が始まったり始まらなかったりするようなのです。
autoStartをtrueにしておかないと、select * from tableのようなSQLも
実行できないので、autoStart=trueにしてあります。
(autoStart=falseだとエラーが出てしまう。)
で、これだと、いつでもTransactionが始まるように思えますが、
SQLの内容によってTransactionが、勝手に終了することがあるようなのです。
複雑なSQLだとFireDACがTransactionを終了させます。
また、単純なSQLでもeofやlast,locateをするとこれもTransactionを終了させるようです。
FireDACのソースを見ると
ユニットFireDAC.physにある
procedure TFDPhysCommandAsyncFetch.HandleFinishedの本体のコメントに
// StartTransaction calls FConnectionObj.Lock and on MSSQL calls Fetch(True).
// On Eof the command is closing. That calls TFDPhysTransaction.InternalNotify,
// which is calling FConnectionObj.Lock. With async fetching that leads to
// deadlock, so call Close in the calling thread.
と書いてあり、(他にもあるかも知れませんが)
必ずしもautoStartだからといって、Transactionが続くわけではなさそうです。
今は、Transactionを継続させるようなSQLに対しては、
CommitしてそのTransactionを終了させています。
ただ、これがそもそものdeadlockの問題とは関係がないのかもしれません。
deadlockの方だけを考えてみると、
また、deadlockのエラーの中に no waitが入っていたので、
これも調べてみました。
FireDACのプロパティでtransactionを no waitから wait lock timeout 5などに
は設定ができません。
wait lock -1 =無限に待ち続ける?のはできます。
TFDConnection.UpdateOptions.LockMode ->lmPessimistic
TFDConnection.UpdateOptions.LockWait ->true
とすると wait lock timeoutになり、無限に待つTransactionになるようです。
ただ、無限に待たれても困るので、
TFDTransactionを通したTFDCommandを使い、
「set transaction read committed record_version read write lock timeout 5」
というSQLを実行すると
wait lock timeout 5のTransactionを開始できます。
少しこれで様子を見てもらう事にしました。
今回、FireBird2.1->FireBird2.5に変えた事と、
FireBird用のアクセスをDevrace社のFibPlusからFireDAC
に変えた事で今まで出ていなかったdeadlock no waitが
頻発するようになりました。
これでdead lockが減ってくれると良いのですけど。
ちなみに、FibPlusはXE4までしか対応していないようです。
MLホームページ:
http://www.freeml.com/delphi-users
----------------------------------------------------------------------
何とかしたい!保険やお金の悩み!
プロに相談してみませんか?
無料保険相談で!JCBギフト6000円分をプレゼント!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nBfeC
------------------------------------------------------[freeml byGMO]--