[delphi-users:4410] FireDACでdeadlockが頻発

663 views
Skip to first unread message

のべ

unread,
Mar 11, 2016, 10:53:19 PM3/11/16
to delphi...@freeml.com

渡辺です。

DelphiXE5とFireBird2.5を使ったアプリケーションを作っています。

自分のところでは起きないのですが、お客様の現場でdeadlockが頻発してしまいます。

数10種類のExeを作っていて、それぞれが
TFDConnectionを持っています。

Updateやdeleteは別のTFDTransactionを使っています。

自分のところで再現出来ないので、分からないのですが、
FireBirdのmon$transactionsを見ていると、
単純なSQLをOpenしたExeとやや複雑なSQLをOpenしたexeでは
単純なSQLをOpenしたexeを実行したときだけmon$transactionsにローが増えていきます。

単純化しようとして、1つのExeに2つのTFDDataSetを用意し、
それぞれ簡単なSQL(1つのテーブルから取り出すだけ)と
やや複雑なSQL(2つ以上のテーブルをJoinする)を入れました。

TFDConnection.InTransactionをデバッガで見ていると、
単純なSQLの方はOpenするとInTransaction=trueとなり、
FireBirdの方のmon$transactionsにローが増えます。

複雑なSQLの方はOpenしてもInTransaction=falseのままで、
FireBirdの方のmon$transactionsにローが増えません。

SQLの内容によって、Transactionが勝手に始まったり、始まらなかったりすると少しやりにくいのですが、

何かこのあたりの情報やご意見をお持ちの方、いらっしゃいませんか?

(deadlockを解消するため、mon$transactionsを見る事が正しいのかどうかも含めご意見いただけるとありがたいです。)

よろしくお願いします。




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【ネスカフェドルチェグストが定期便申込でマシン代金無料!】
サイズもコンパクトでかわいいドルチェグストが
カプセル定期便申込とセットでマシン代金無料!
今なら宇治抹茶カプセル1箱プレゼントキャンペーン中
http://ad.freeml.com/cgi-bin/sa.cgi?id=nALbV
------------------------------------------------------[freeml byGMO]--

DEKO

unread,
Mar 12, 2016, 11:19:38 PM3/12/16
to delphi...@freeml.com
こんにちは。

> TFDConnection.InTransactionをデバッガで見ていると、
> 単純なSQLの方はOpenするとInTransaction=trueとなり、
> FireBirdの方のmon$transactionsにローが増えます。

自動コミットモードになっているとか?
http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%AE%A1%E7%90%86%EF%BC%88FireDAC%EF%BC%89

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
freemlを運営するGMOメディア株式会社では、
2017年新卒採用の募集をしております。
募集の職種は下記3職種
エンジニア職/Webデザイナー職/営業企画職
興味をお持ちの方はマイナビよりエントリーお願いします
http://ad.freeml.com/cgi-bin/sa.cgi?id=nAWzw
------------------------------------------------------[freeml byGMO]--

のべ

unread,
Mar 13, 2016, 8:47:55 PM3/13/16
to delphi...@freeml.com
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]--

トム猫(はやしつとむ)

unread,
Mar 13, 2016, 9:07:43 PM3/13/16
to delphi...@freeml.com
はやしです。

FireDACを使ってないので、一般論ですが。

トランザクションのスタート、コミット、ロールバックは全て自前で制御した方がいいです。

トランザクションスタート
try
 処理ほげほげ
 コミット
except
 ロールバック
end;

が基本だと思いますが・・・

+++++++++++++++++++++++++++++++

From Hayashi "tomneko" tsutomu
Mail: tomn...@gmail.com
Web: http://www.tomnekosoft.com

+++++++++++++++++++++++++++++++


2016年3月14日 9:47 のべ <delphi...@freeml.com>:
MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【ネスカフェドルチェグストが定期便申込でマシン代金無料!】
サイズもコンパクトでかわいいドルチェグストが
カプセル定期便申込とセットでマシン代金無料!
今なら宇治抹茶カプセル1箱プレゼントキャンペーン中
http://ad.freeml.com/cgi-bin/sa.cgi?id=nBfiP
------------------------------------------------------[freeml byGMO]--

DEKO

unread,
Mar 13, 2016, 9:08:21 PM3/13/16
to delphi...@freeml.com
> ちなみに、FibPlusはXE4までしか対応していないようです。

IBX + Firebird はちょっといじれば最近の Delphi でもそこそこ使えます。
http://ht-deko.com/ft1511.html#151102_03

本当は FireDAC を使うのが筋なのでしょうけれど (但し Ent 以上)。

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
freemlを運営するGMOメディア株式会社では、
2017年新卒採用の募集をしております。
募集の職種は下記3職種
エンジニア職/Webデザイナー職/営業企画職
興味をお持ちの方はマイナビよりエントリーお願いします
http://ad.freeml.com/cgi-bin/sa.cgi?id=nBfpV
------------------------------------------------------[freeml byGMO]--

DEKO

unread,
Mar 13, 2016, 9:21:43 PM3/13/16
to delphi...@freeml.com
> トランザクションのスタート、コミット、ロールバックは全て自前で制御した方がいいです。

もし、渡辺さんがトランザクションのスタートを
コンポーネント任せにされていたのであれば、林さんの意見に同意します。
自前で制御しないと意図しない動作になりかねません。

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
何とかしたい!保険やお金の悩み!
プロに相談してみませんか?
無料保険相談で!JCBギフト6000円分をプレゼント!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nBf67
------------------------------------------------------[freeml byGMO]--

のべ

unread,
Mar 13, 2016, 10:33:56 PM3/13/16
to delphi...@freeml.com

はやしさん、DEKOさんありがとうございます。


私も基本的にはautoStartはしたくありません。

ですが、FireDACではなぜかAutoStartでないと、接続させてくれないようです。
なので、勝手にStartしちゃうので、OpenしたらCommitするようにしてみました。

できればFireDAC一本で行きたいなと考えています。

今は修正したプログラムを現地で使ってもらっています。
また何かありましたら、ご相談させて頂こうと思います。

ありがとうございました。



MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【ネスカフェドルチェグストが定期便申込でマシン代金無料!】
サイズもコンパクトでかわいいドルチェグストが
カプセル定期便申込とセットでマシン代金無料!
今なら宇治抹茶カプセル1箱プレゼントキャンペーン中
http://ad.freeml.com/cgi-bin/sa.cgi?id=nBgz3
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages