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

Considering alternative solutions

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. However, 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
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.

主站蜘蛛池模板: 金华市| 古蔺县| 文山县| 吴川市| 鄂托克旗| 万安县| 贵定县| 桃园县| 林甸县| 古丈县| 昌都县| 根河市| 行唐县| 巨鹿县| 海原县| 冕宁县| 绵阳市| 云霄县| 梅河口市| 连江县| 临沧市| 上虞市| 和政县| 贵德县| 桂林市| 泰宁县| 安达市| 米泉市| 禹州市| 铁力市| 景泰县| 耒阳市| 达拉特旗| 安岳县| 卓资县| 方山县| 龙州县| 扎赉特旗| 乌什县| 卢湾区| 安顺市|