在「 More Concurrency: Improved Locking In PostgreSQL 」這邊提到 PostgreSQL 的 Row Locking 的改善,也就是 SELECT ... FOR UPDATE
與 SELECT ... FOR SHARE
。
查了一下 SELECT
的文件,在 7.2 開始提供 FOR UPDATE
( PostgreSQL: Documentation: 7.2: SELECT ),在 8.1 開始提供 FOR SHARE
( PostgreSQL: Documentation: 8.1: SELECT ),以維基百科上的紀錄來看,7.2 是 2002 年二月,8.1 是 2005 年十一月,都是已經提很久的功能了。
用 FOR UPDATE
與 FOR SHARE
可以降低對 transaction 的依賴程度,PostgreSQL 的預設值是 READ COMMITTED
,配合 Row Locking 就已經可以做到不少效果了,不需要用到 SERIALIZABLE
等級。
而在最新的 PostgreSQL 9.5 (目前還是開發版),則又多提供了 FOR UPDATE SKIP LOCKED
功能,以官方提供的範例來說,就可以直接避開選位造成的 lock 問題了:
This makes sense because 100 users checking for a free seat concurrently will get 100 different rows. The consequence is that you are not stuck with 1 CPU but you can nicely scale out to all CPUs in the system. As conflicts cannot happen anymore, nobody has to wait on somebody else.
對 locking 控制的更細微。