sql - 其他用户能否闯入我的sql操作序列?

标签 sql postgresql concurrency auto-increment sql-insert

我向数据库 (Postgres) 执行插入操作,然后立即获取最后一个序列号。如果 10 个人做同样的事情,他们是否会破坏我的数据库操作顺序?

INSERT INTO table VALUES (DEFAULT,...);
SELECT currval(pg_get_serial_sequence('table','column')) as inserted_id;

恐怕会发生这样的情况:

INSERT INTO table VALUES (DEFAULT,...);
Meanwhile, another user was doing insertions and I end up getting the wrong id;
SELECT currval(pg_get_serial_sequence('table','column')) as inserted_id;

最佳答案

pg_get_serial_sequence(table_name, column_name) 获取 serialsmallserialbigserial 序列的名称列用途。

来自 the PostgreSQL documentation currval 将:

Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Because this is returning a session-local value, it gives a predictable answer whether or not other sessions have executed nextval since the current session did.

基于以上,注意重点,回答你的问题“如果10个人做同样的事情,他们可以打破我的数据库操作顺序吗?”不是。

这也很容易测试。使用 pgAdmin 的两个实例或您喜欢的任何客户端。

在客户端 1 上:

CREATE TABLE foo (id BIGSERIAL PRIMARY KEY, some_column TEXT);
INSERT INTO foo(some_column) VALUES('a');

在客户端 2 上:

INSERT INTO foo(some_column) VALUES('b');

在客户端 1 上:

SELECT CURRVAL(PG_GET_SERIAL_SEQUENCE('foo','id')) AS inserted_id; -- it will return 1

在客户端 2 上:

SELECT CURRVAL(PG_GET_SERIAL_SEQUENCE('foo','id')) AS inserted_id; -- it will return 2

关于sql - 其他用户能否闯入我的sql操作序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28520207/

相关文章:

SQL:如果记录列表存在,返回 "true"?

postgresql - 间隔的翻译

java - 在特定时间运行java线程

python - 如果它是通过 query_property 创建的,是否可以缩小 SQLAlchemy 中生成的查询的范围?

sql - 在 SQL 中查找某人的年龄

MySQL - 分组依据进行计数,空值除外

postgresql - 如何通过 docker-compose 网络连接到 postgres?

java - JPA继承查询(Eclipse Link)

java - 线程问题 - java.util.concurrent - 可运行/可调用

scala - 在 Scala 中,synchronized block 是否锁定 block 中访问的所有全局变量?