当另一个用户打开交易时在数据库上添加 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 确切地看到什么被什么阻止了。
在同一个项目中工作,碰巧一些程序员正在测试 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 确切地看到什么被什么阻止了。