如何模拟/测试PostgreSQL事务回滚错误?

时间:2015-02-05 13:46:09

标签: python postgresql concurrency transactions psycopg2

一个应用程序会定期抛出一个TransactionRollbackError,我很难找到它被抛出的原因。

错误消息如下:

TransactionRollbackError: could not serialize access due to concurrent update

不幸的是,这些例外只发生在生产环境中,而不是在我的环境中。

我想自己模拟这样的错误。但是我该怎么办?我应该在同一张表中插入记录吗?我应该编辑与应用程序相同的记录吗?我应该把锁放在某个地方吗?在桌子上?单排? 名称和消息表明多个事务尝试更新数据库。并且涉及事务回滚,所以看来。

编辑:现在我发现了导致问题的原因:让我们说事务1更新表A上的值,记录X.另一个事务2,在表B中插入一个值,表A的外键 - 记录X.一旦提交事务1,事务2就会出现以下错误:

ERROR:  could not serialize access due to concurrent update
CONTEXT:  SQL statement "SELECT 1 FROM ONLY "public"."table_a" x WHERE "id" OPERATOR(pg_catalog.=) $1 FOR SHARE OF x"

我认为会发生这种情况:

交易2需要记录X(成功完成)。事务1已锁定记录X,因此事务2出现此错误。

0 个答案:

没有答案