官术网_书友最值得收藏!

Utilizing advisory locks

PostgreSQL has a highly efficient and sophisticated transaction machinery that is capable of handling locks in a really fine-grained and efficient way. Some years ago, some people came up with the idea of using this code to synchronize applications with each other.

Thus, advisory locks were born.

When using advisory locks, it is important to mention that they won't go away on COMMIT as normal locks do. Therefore, it is really important to make sure that unlocking is done properly and in a totally reliable way.

If you decide to use an advisory lock, what you really lock is a number. So, this is not about rows or data; it is really just a number. Here is how it works:

The first transaction will lock 15. The second transaction has to wait until this number has been unlocked again. The second session will even wait after the first one has committed. This is highly important as you cannot rely on the fact that the end of the transaction will nicely and miraculously solve things for you.

If you want to unlock all locked numbers, PostgreSQL offers the pg_advisory_unlock_all() function to do exactly this:

test=# SELECT pg_advisory_unlock_all(); 
pg_advisory_unlock_all 
------------------------

(1 row)

Sometimes, you might want to see if you can get a lock and error-out if it is not possible. To achieve this, PostgreSQL offers a couple of function, to see a list of all such available functions, at the command line, enter:  df *try*advisory*.

主站蜘蛛池模板: 喀什市| 兴业县| 文山县| 双桥区| 肇源县| 织金县| 阿鲁科尔沁旗| 凤山市| 连平县| 双辽市| 修文县| 吴江市| 丹江口市| 承德市| 晋江市| 岳阳市| 普兰县| 民勤县| 元阳县| 马山县| 遂宁市| 富平县| 革吉县| 静宁县| 南丹县| 土默特右旗| 扎兰屯市| 天台县| 咸阳市| 南江县| 建阳市| 固安县| 天峨县| 嘉善县| 三原县| 江源县| 贺州市| 开原市| 从化市| 思茅市| 汉中市|