AB Lab

abgata20000 blog.

Select_for_updateについて(並列処理の運用)

参考サイト

サンプル

1
2
3
4
5
6
begin;

select * from t_sample where id > 1 AND flg = 0 order by id asc limit1 for update;

commit;
# コミットするまでは、同一のレコードへ処理(select文を含む)をロックする

注意点

  • トランザクションの効くストレージエンジン(innodb)でのみ有効
  • for update をつけていないクエリはロックされない
  • 同一のレコードへの処理をロックするため別条件で別レコードへの処理はロックされない
1
where id = 1

1
where id = 2

であればロックされない

1
where id > 1

1
where id = 2

であればロックされる

ActiveRecordでの利用方法

1
2
3
4
5
6
7
8
9
Sample.transaction do
  # select * from table where flg = 0 limit 1 for update
  @target = Sample.where("flg = 0 ").lock(true).first

  @target['flg'] = 1
  @target.save

end