2012-04-12 10 views
1

私は6スクリプト/タスクを持っています。それらの一つ一つは、ロールバックした後、MySQLデータベースからDELETE/SELECT/UPDATE/INSERTを意味し、その仕事を行う、MySQLのトランザクションを開始します。MySQL設定

データベースが、指定された状態Sである場合、タスクが終了したときので、私は、一つのタスクを起動し、データベースがバック状態にS.

私が順次スクリプトを起動すると、すべてが正常に動作している:

  • 状態SにおけるDB
  • タスク1
  • DB状態Sにおける
  • タスク2
  • STにおけるDB状態S

でS

  • ...
  • ...
  • タスク6
  • DB食べたしかし、私は、複数のスレッドによる処理をスピードアップしたいとスクリプトを起動します並行して。状態Sで

    • DB同時に
    • 6タスク
    • 状態S

    一部のタスクをランダムに失敗でDB、私は時々、このエラーが出る:

    SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction 
    

    私は理解していない、私はトランザクションがそのためのものだと思った。私は行方不明のものがありますか?どんな経験、助言、手がかりも大歓迎です。

    MySQLの設定は次のとおりです。

    innodb_lock_wait_timeout = 500 
    transaction-isolation = SERIALIZABLE 
    

    と私は、各セッションの開始時にAUTOCOMMIT = 0を追加します。

    PS:データベースが構築され、私がその後変更REPEATABLE READ分離レベルの下で使用しました。

  • +0

    いくつかのコードは、長い道のりを行くだろう。変数との同期の問題が発生しているようです。これは、あなたがコミットされていない/状態をロールバックにある変数/データベースの状態で問題が発生しているように聞こえる私の以前のコメントを明確にするために申し訳ありませんが、ロールバック状態にある取引など – Namphibian

    +0

    である可能性があります。 – Namphibian

    +0

    さて、関連する記事を読んだあと、それを行うのは正しい方法ではないようです。私は各スレッドごとに完全に分離されたデータを必要とするので、私の洞察はおそらく6つのミラーデータベースで動作することです。 – Joucks

    答えて

    0

    デッドロックを防止するには、すべてのトランザクション/プロセスが、すべての場合に同じORDER BYを持つ必要なすべてのデータ/テーブルに対してSELECT ... FOR UPDATEを実行し、テーブル自体の順序が同じであることを確認しますMySQLのリピート可能な読み取り分離レベル)。

    とは別に、分離レベルとトランザクションはではなく、デッドロックを処理することを意味するです。逆の場合はデッドロックが存在します。あなたはデッドロックが発生した場合、あなたは( - 、あなたはすべてのトランザクションを必要としない場合がありますされていない場合、はるかに深刻なかもしれません)、データセットの一貫性のない状態を持っているでしょう良いチャンスがあります。

    関連する問題