sql >> データベース >  >> RDS >> PostgreSQL

複数のトランザクション中のデータベース行のロック

    フラグを使用した解決策は実行可能であるように思われます。必要なのは、ロックを期限切れにすることだけだと思います。基本的に、ロックを設計する方法は、ロックが取得されたときにタイムスタンプを書き込んで、プロセスが更新する必要があるようにすることです。 レコードの処理中は、頻繁に(つまり、30秒ごとに)ロックします。プロセスが停止するか、その他の方法で作業を完了できない場合、ロックは期限切れになり、他のプロセスはロックを解除できます。 タイムアウト期間が2倍以上経過した場合。

    プロセスがレコードの処理を終了すると、ロックフラグがクリアされ、レコードが処理済みとしてマークされます(ここでも別のフラグ)。

    おそらく、2つのフィールドが必要になるでしょう。1つはタイムスタンプロックフラグを格納し、もう1つはどのプロセスがロックを所有しているかを示します(気になる場合)。 「次のアクション」の概念が意味を持つように、テーブル内のレコードを並べ替えるために使用できるある種のキーがあると思います。

    このようなクエリを使用して、処理する次のレコードを取得できます。

     -- find the next available process and "lock" it by updating it's flag
     UPDATE actions_tabe
        SET LockFlag = @timestamp,
            Process = @processname
      WHERE Id IN (SELECT Id
                FROM actions_table
               WHERE LockFlag IS null
                 AND IsComplete = '0'
                 AND ScheduledTime < now()
               ORDER BY Scheduledtime ASC, Id ASC
               LIMIT 1);
    
     -- return the Id and Action of the record that was just marked above
     SELECT Id, Action
       FROM actions_table
      WHERE Process = @processname
    

    ここにサンプルフィドル: http://sqlfiddle.com/#!11/9c120/26 / 1




    1. VB.Netを使用してオンラインMySQLデータベースに接続する

    2. Pgで2つの単語が隣接している文を検索します

    3. OracleでSQLを使用して現在の年を取得するにはどうすればよいですか?

    4. 主キーIDがbigintデータ型の制限に達しています