フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1] 2
トピック: TIBTRANSACTION
SG
メンバー
投稿数: 107
TIBTRANSACTION
on: 2020/02/13 16:36 Thu

TIBTRANSACTION の オプションをREAD_COMMITED にして
レコードを追加するPROCEDUREを記述しています
レコードが追加されるとINSERT TRIGGERが起動するしくみです
TRIGGERを含めてトランザクションされているのでしょうか?

Owl's perspective
メンバー
投稿数: 24
Re: TIBTRANSACTION
on: 2020/02/14 10:55 Fri

一般的にはトリガはトランザクションの内側で動作すると思います…ってそういう話で合ってます?
外していたらすいません。

SG
メンバー
投稿数: 107
Re: TIBTRANSACTION
on: 2020/02/14 11:28 Fri

私もそのように理解しているのですが

パソコンA
プロシージャでA_TEBLEのRECORD1を削除したら トリガーでB_TABLEのRECORD1を削除
プロシージャでA_TEBLEのRECORD1を追加したら トリガーでB_TABLEのRECORD1を追加

パソコンB
プロシージャでA_TEBLEのRECORD1を削除したら トリガーでB_TABLEのRECORD1を削除
プロシージャでA_TEBLEのRECORD1を追加したら トリガーでB_TABLEのRECORD1を追加

同時に実行すると(トランザクションはWAIT)
パソコンAが実行されパソコンBは待っています
パソコンAの処理が終わるとパソコンBの処理が動きます。
結果は
パソコンBのB_TABLEがキー違反でエラーになります。削除しているのに削除されていない?
(同じレコードを2台のパソコンで処理していて後で処理したほうが残るシステム)

Owl's perspective
メンバー
投稿数: 24
Re: TIBTRANSACTION
on: 2020/02/14 11:49 Fri

うーん、IBX(TIBTransaction)の問題ではなくInterBaseの話だと思いますが…整理させてください。

IBサーバ上にstored procesureがあり、その内部でA_TABLEに対する追加および削除をしていて、
さらにA_TABLEのINSERT/DELETEにトリガが設定してあってそのトリガでB_TABLE上の当該レコードを追加/削除している。

2つの接続からstored procedureを同時に呼び出すと後から実行されるほうでB_TABLE上の追加で主キー制約違反になる。

ということでしょうか?

これをDelphi上のプログラムからではなくIBConsoleやその他のツールでやったらどうですか?(衝突させるのが難しいか…)

SG
メンバー
投稿数: 107
Re: TIBTRANSACTION
on: 2020/02/14 11:55 Fri

その説明の通りです。
順番は
1.DELETE
2.INSERT
の流れです

DBはFirebird2.5ですが…

Owl's perspective
メンバー
投稿数: 24
Re: TIBTRANSACTION
on: 2020/02/14 12:12 Fri

明示的にトランザクションを掛けてますか?トランザクション分離レベルはどうなってます?
InterBase/Firebirdはトランザクションまわりが特殊(いい意味で)なので…。

これ以上は詳しい人を召喚したほうがいいかも(木村さんとかはやしさんとかDEKOさんとか)
とりあえず参考になりそうなリンクを…

http://blog.kimuradb.com/?eid=877400
https://www.firebirdsql.org/file/community/conference-2014/pdf/03_ibsurgeon_how_transactions_work.pdf

あとIBXはFirebird 2以降には完全には対応してなかった気が…(今回の件とは関係ないと思いますけど

SG
メンバー
投稿数: 107
Re: TIBTRANSACTION
on: 2020/02/14 12:15 Fri

明示的にTIBTRANSACTIONで掛けています。READ_COMMITです WAITはデフォルトのようです。

Owl's perspective
メンバー
投稿数: 24
Re: TIBTRANSACTION
on: 2020/02/14 14:59 Fri

ん~、情報小出しはつらいので、最小限の再現コードと設定をまとめてもらったほうが…
とりあえずスナップショット(concurrency)にしたら状況は変わりますか?あるいはコミット済の読み取り(read_committed+rec_version)とかでは?
(IBTransactionコンポーネント→右クリック→トランザクションエディタで)

SG
メンバー
投稿数: 107
Re: TIBTRANSACTION
on: 2020/02/14 15:37 Fri

SNAPSHOT->デッドロック
READ_COMMITED+REC_VERSION->canot update erased record ……
でエラーです

SG
メンバー
投稿数: 107
Re: TIBTRANSACTION
on: 2020/02/14 19:31 Fri

結果を見ると
パソコンAの処理開始(パソコンBは待っている)
パソコンAの処理終了
パソコンBの処理開始
 DELETE INSERTの順で記述しているのにDELETEがされていない
ような感じです

ページ: [1] 2
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.037 sec.