- Mastering PostgreSQL 9.6
- Hans Jurgen Schonig
- 213字
- 2021-07-09 19:57:12
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.
- 三菱FX3U/5U PLC從入門到精通
- 電腦上網直通車
- Implementing Oracle API Platform Cloud Service
- 網絡化分布式系統預測控制
- OpenStack Cloud Computing Cookbook
- 大數據驅動的機械裝備智能運維理論及應用
- Deep Reinforcement Learning Hands-On
- 單片機C語言應用100例
- INSTANT Adobe Story Starter
- 未來學徒:讀懂人工智能飛馳時代
- Xilinx FPGA高級設計及應用
- 筆記本電腦使用與維護
- Eclipse全程指南
- Learn T-SQL Querying
- VMware vSphere 6.5 Cookbook(Third Edition)