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

Utilizing advisory locks

PostgreSQL has highly efficient and sophisticated transaction machinery that is capable of handling locks in a really fine-grained and efficient way. A few years ago, 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 like 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 isn't about rows or data; it is really just a number. Here's 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 whether you can get a lock and error out if this isn't possible. To achieve this, PostgreSQL offers a couple of functions; to see a list of all such available functions, enter \df *try*advisory* at the command line.

主站蜘蛛池模板: 平谷区| 三明市| 五峰| 科技| 屯留县| 黑山县| 兴和县| 双城市| 佳木斯市| 阿拉善右旗| 无锡市| 迭部县| 泸西县| 绥中县| 威远县| 乌拉特后旗| 柞水县| 汝南县| 苍溪县| 永吉县| 南昌市| 广元市| 视频| 石城县| 大连市| 连云港市| 合阳县| 兴化市| 菏泽市| 博客| 枝江市| 夏津县| 松溪县| 揭东县| 滦平县| 东莞市| 凉城县| 滨海县| 瓮安县| 勐海县| 香格里拉县|