PostgreSQLのReturning句


 PostgreSQLでは、Returning句というのが使える。
 これは、更新系のクエリで更新後の値を返せるということなのだが、かなり有用だと思う。


 データの整合性のためにトランザクションでロックをかけなければいけないような要件で、普通にロックをかけてしまうと、デッドロックや待ち時間、タイムアウト
などの問題がでそうだというケースがある。


 そんな時に、このReturning句は使い物になってくれる。
 とりあえず更新してしまい、Returning句をつけてその更新後の値を同時に返させると、その値をチェックして整合性がおかしければ更新を戻すというロジックを組める。
このロジックはトランザクションをかけないで整合性を維持できる。


 更新前にselectで判定した場合や、更新した後にselectをかけるというやり方だと同時アクセスによって更新とselectの間の短い時間差の間が引き金で整合性が崩れる場合がある。
あるいはトランザクションをかければ整合性は保たれるが、同時アクセス時にロックがかかって待たされ、レスポンスが悪くなる。
 一方でReturning句は更新と同時に結果がとれているので、ここで判定すればトランザクションをかけなくても整合性を維持できるのだ。


 MySQLではこれはできないはずだと思う。興味深かった。