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

Considering alternative solutions

However, there is an alternative solution to the problem. Consider the following example: you are asked to write an application generating invoice numbers. The tax office might require you to create invoice numbers without gaps and without duplicates. How would you do it? Of course, one solution would be a table lock. But you can really do better. Here is what I would do:

test=# CREATE TABLE t_invoice (id int PRIMARY KEY); 
CREATE TABLE
test=# CREATE TABLE t_watermark (id int);
CREATE TABLE
test=# INSERT INTO t_watermark VALUES (0);
INSERT 0 1
test=# WITH x AS (UPDATE t_watermark SET id = id + 1 RETURNING *)
INSERT INTO t_invoice
SELECT * FROM x RETURNING *;
id
----
1
(1 row)

In this case, I introduced a table called t_watermark. It contains just one row. The WITH will be executed first. The row will be locked and incremented, and the new value will be returned. Only one person can do this at a time. The value returned by the CTE is then used in the invoice table. It is guaranteed to be unique. The beauty is that there is only a simple row lock on the watermark table; no reads will be blocked in the invoice table. Overall, this way is more scalable.

主站蜘蛛池模板: 阿拉善盟| 中阳县| 涪陵区| 柏乡县| 乳源| 南部县| 武鸣县| 古田县| 北辰区| 丁青县| 界首市| 广西| 寿光市| 田林县| 桦甸市| 宿迁市| 绵竹市| 东光县| 闽清县| 禹城市| 柳州市| 墨脱县| 德清县| 太仆寺旗| 溧水县| 石首市| 河南省| 高淳县| 固镇县| 泰安市| 塔城市| 城固县| 盐源县| 汨罗市| 湘乡市| 东明县| 阜新市| 灯塔市| 贵南县| 临高县| 永新县|