• 締切済み

UPDATE文で発生するデッドロックについて、教えてください。

siddhaarthaの回答

回答No.7

回答が遅れました。 色々なアドバイスが出てきていますので、一度切り分けて 考えてみてはいかがでしょうか。 ・SPから当該UPDATE文のみを抜き出して実行してもデッドロックになるか? ・TABLOCKにした場合でも同じか? ・ロックの待ち時間を長くしてみてもTIMEOUTが発生するか? をまずは試してみてください。 その結果によって原因がわかるかもしれませんし、 別のアドバイスが出来るかもしれません。

関連するQ&A

  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • UPDATE文について

    昨日こちらで自分の間違ったSQL文をご指摘頂き 時間計算の処理は実装する事が出来たのですが その後の計算処理が終わった後、計算結果をDBに格納する処理で 再度躓いてしまったので、再度のご教授お願いします。 $sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total     FROM 労働時間テーブル WHERE id = 'ログインしている人のID';"; $total_Time = pg_query($con, $sql); $total_Time = pg_fetch_result($total_Time, 0, 'total'); // 確認のため、表示 echo $total_Time; で値はきちんと表示されおります。 しかし、この後UPDATE文で $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; pg_query($con, $sql); と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<) 試しに $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に 表示されていた値とは違う値がDBに格納されるようになってしまいました。 どのように解決したらよいか、悩んでおります。 そもそもの考え方から間違っているのでしょうか? ご教授の程、よろしくお願い致します。

  • 同じSELECT文同士でのデッドロックが発生

    ORACLE10Gを使用したアプリ開発中です。 アプリ中、1テーブルに対して全く同じ条件で 複数レコードを悲観的ロック(for update)しながら取得し、 項目を更新するSQLを発行します。 単発では問題なかったのですが、処理時間の関係で パラレルで実行された場合にデッドロックを検出することがあります。 ORACLEのudumpの中を確認すると全く同じSELECTのSQL同士で デッドロックが発生したと表示されています。 こういった場合、どういう原因が考えられるでしょうか? (同じ条件による悲観的ロックであれば多重実行でも  処理待ちをするだけだと思っているのですが・・・) よろしくお願いします。

  • UPDATE文のWHERE句にファンクション使いたい

    [OSのVER]:WindowsXP [OracleのVER]:9i UPDATE時にWHERE句に自作のユーザ関数を使いたいと思っていますが、 更新されずに困っています。 (エラーも出ません) 例) update TG_TBL set S_YMD = '20060601', LAST_UPDATE = SYSDATE , where ID_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) ←使用したいチェック関数 ちなみに、以下のように同じ関数を使用すると1件のレコードが検索されます。 select * from TG_TBL where KANRI_NO = '1401001' and CHK_SIK(ID_NO) in (1,2) 関数部分をコメントアウトして、実行すると1件更新されます。 UPDATE文にユーザ関数を使用することはできないのでしょうか? 皆様のお知恵をお貸しください。 よろしく、お願いいたします。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • updateのsql文について

    mysql5.0です。 いかのsql文のなかdistrb_date項目にシステム日付を代入させたいですが書き方がわからなくて困っています。よろしくお願いします。 UPDATE file_tbl SET status = 2, distrb_date = (???), user_id = %s where file_name = %s AND file_type = %s order by file_ymd DESC

    • ベストアンサー
    • MySQL
  • select for updateのロック

    オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。

  • Select文とデッドロックについて

    現在のような処理をしています。 SQL Server2008 R2 Expless プログラム1  select count(*) from TABLE_A プログラム2 BeginTrance SERIALIZABLE  select count(*) from TABLE_A Update TABLE_B set F1=123 Where P1=1 Commit ※ここで P1はTABLE_Bのプライマリキーとします。 この2つのプログラムを同時に実行している時に、プログラム1のSELECT文でデッドロックが発生した との連絡ありました。 プログラム2でもエラーが発生しているのかもしれませんが、現状調査不可能為不明です。 いろいろデッドロック、ロックヒントなどいろいろ調べてみた結果、なんとなく発生するかも?とは思われますが、このような場合、本当にデッドロックが発生するのでしょうか? また、発生する場合には、何と何がデッドロックになっているのでしょうか? (発生するはずがないとなると調査する視点を変えてみます。) よろしくお願いします。

  • T-SQL パラメータがNULLの場合条件含めず

    お世話になります。 SQL Server での T-SQLのWhere句のパラメータがNullであった場合に これをWhere句から除外したいのですが・・・ 今まで、こういう場合には、SQL文をプログラム上で作成してそのSQL文を ソースにしてきたのですが、動作速度や汎用性を考えてストアドプロシジャーを使用するのが今後の為と思いこちらで質問させていただきました。 例えば・・・条件のところから WHERE     IF @パラメータ1 Is Not Null         (dbo.TEST.A =< @パラメータ1) AND     IF @パラメータ2 Is Not Null         (dbo.TEST.B =< @パラメータ2) AND このように記述してみたのですが、WHEREが記述された後ではダメなようで・・・次に WHERE     CASE         WHEN @パラメータ1Is Not Null THEN (dbo.TEST.A = @パラメータ1) AND         WHEN @パラメータ2Is Not Null THEN (dbo.TEST.B = @パラメータ2) AND     END 上記にように記述してもやはりエラーが。 WHERE句の後にパラメータを評価し、WHERE句に含めるか、 含めないか記述するにはどうすればいいでしょうか? 初歩的な事かもしれませんが、何卒よろしくお願いいたします。

  • SELECT文でのデッドロックに対しての対処方

    先日よりデッドロックが発生するようになり、確認の為にトレースログを 抽出するように設定かけたのですが、UPDATE文とSELECT文がぶつかり デッドロックが発生している事がわかりました。 しかし、UPDATE文にはトランザクションをかけていますが SELECT文には特にロックかけていない為、どうして起こっているのか わかっていません。 SELECT文を読んでいる時にUPDATE文によって レコードに変更があった為、デッドロックが発生したのでしょうか? SELECT文にはUNLOCKをつけた方がいいのでしょうか? プログラムはDELPHI DBはSQLSERVER2000になります。 お忙しい所申し訳ありません。 宜しくお願い致します。