当另一个用户打开交易时在数据库上添加 table

Add table on DB when another user has a transaction open

在同一个项目中工作,碰巧一些程序员正在测试 sw(使用事务),而其他人想要创建或更改表。

当第二组启动 "CREATE TABLE" 时,查询将继续工作,直到所有事务都关闭。

有什么方法可以在其他用户进行交易时成功启动 CREATE 查询吗?

我们将 postgresql 用于数据库,将 C# 与 Npgsql 用于软件。

不,这是设计使然。您想如何删除某人仍在使用的 table?

唯一的选择是中断这些交易。我可以想到两种方法来做到这一点:

  • 调用pg_cancel_backend终止所有锁定tabletable的事务。

  • idle_in_transaction_session_timeout 设置为默认值 "infinite" 以外的其他值,以便 PostgreSQL 自动取消这些阻塞事务。

您的开发人员不会喜欢这两个选项中的任何一个,但在这种情况下,没有办法让每个人都满意。

ALTER TABLE也是如此。

运行 CREATE TABLE 你写的应该不是问题,除非你必须先删除那个名字的 table(见上文)。

并发的 CREATE TABLE 不应相互干扰,除非它们试图对初始表使用相同的名称。如果他们使用不同的名称并且仍然阻塞,那么您需要更详细地描述这些其他事务正在做什么。您可以 monitor locks 确切地看到什么被什么阻止了。