我使用libpqxx來連接到postgresql。一切都很好,直到我在一行上的一個表上運行可查詢的查詢。postgresql永久掛在可序列化事務
表:
CREATE TABLE t1(id integer primary key);
的Postgres 9.4.4_x64
pqxx::connection c1(conn_str);
pqxx::connection c2(conn_str);
pqxx::transaction<pqxx::isolation_level::serializable> t1(c1);
t1.exec("INSERT INTO t1 (id) VALUES (25)");
pqxx::transaction<pqxx::isolation_level::serializable> t2(c2);
t2.exec("INSERT INTO t1 (id) VALUES (25)"); //hang here
t2.commit();
t1.commit();
我的程序掛起,直到永遠。掛在PQexec函數中。爲什麼?我認爲它必須回滾一個交易嗎?但不是?只是掛起。
更新:純libpq的相同的結果:
c1 = PQconnectdb(conninfo);
c2 = PQconnectdb(conninfo);
res1 = PQexec(c1, "BEGIN");
PQclear(res1);
res1 = PQexec(c1, "INSERT INTO t1 (id) VALUES (104)");
PQclear(res1);
res2 = PQexec(c2, "BEGIN");
PQclear(res2);
res2 = PQexec(c2, "INSERT INTO t1 (id) VALUES (104)");
PQclear(res2);
res2 = PQexec(c2, "END");
PQclear(res2);
res1 = PQexec(c1, "END");
PQclear(res1);
的PostgreSQL 9.1 - 相同的懸掛
使用不同的隔離級別時會發生什麼情況。難道你沒有得到相同的結果嗎? – sstan
可能是dba.SE的一個很好的候選人。 –
它不是真的掛在下一行嗎? 't2.commit(); //掛在這裏' –