gpt4 book ai didi

c++ - 如果同时运行,BIGSERIAL 事务是否安全? (PostgreSQL,libpqxx)

转载 作者:行者123 更新时间:2023-11-28 04:10:35 25 4
gpt4 key购买 nike

假设我有以下表格。

CREATE TABLE IF NOT EXISTS Game
(
GameNr BIGSERIAL PRIMARY KEY,
blabla int --More values
);


CREATE TABLE IF NOT EXISTS player
(
GameNr BIGINT references Hand (HandNr),
FOO int --More values
);

以及以下 C++ 代码:一个事务类中的 2 个简单的 INSERT 语句。


pqxx::connection database_connection("CONNECT TO DATABASE INFORMATION");

database_connection.prepare("Game_Insert", "INSERT INTO Game(blabla)\
VALUES($1)\
RETURNING gamenr");


database_connection.prepare("player_Insert",INSERT INTO player(GameNr,FOO "\
VALUES($1, $2)");

pqxx::work work(database_connection);

try
{
pqxx::result result = work.exec_prepared("Game_Insert",2);

int64_t game_nr;
result.at(0).at(0).to(game_nr);

for(const auto& player: players)
{
result = work.exec_prepared("player_Insert",game_nr,2);
}


work.commit();

}
catch (const std::exception& e) {
std::cout << e.what() << "\n";
work.abort();
}

现在这段代码并发运行了很多次。 BIGSERIAL 序列会发生什么情况,数字或重复项之间是否可以有任何间隙?

谷歌搜索给了我令人困惑的答案。

最佳答案

您不必担心 bigserial 和 bigint 之间的区别。 Bigserial实际上并没有成为一种数据类型,它是为了方便将列定义为bigint,创建一个序列,并使用该序列作为默认值。数据类型变为 bigint 参见下面的创建表和表说明。

postgres=# create table Games(GameNr bigserial, blabla integer);
CREATE TABLE
postgres=# \d+ games
Table "public.games"
Column | Type | Modifiers | Storage | Stats target | Description
--------+---------+--------------------------------------------------------+---------+--------------+-------------
gamenr | bigint | not null default nextval('games_gamenr_seq'::regclass) | plain | |
blabla | integer | | plain | |


postgres=#

并且在某些时候会有间隙,总是会出现在序列中,但不会重复。

关于c++ - 如果同时运行,BIGSERIAL 事务是否安全? (PostgreSQL,libpqxx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com