PostgreSQL错误:ERROR: current transaction is aborted, commands ignored until end of transaction bloc

报错代码:

try:
	user_service.create_user()
except Exception as e:
	logging.info(f"错误的处理信息,跳过创建用户")

报错:

ERROR: current transaction is aborted, commands ignored until end of transaction bloc

错误原因:

出现这个错误的原因是:在一个事务中,第一个SQL查询失败,并且你忽略了该失败并继续后面的代码。当你使用同样的连接(TRANSACTION)来运行另一个查询。第二个正确形成的查询会抛出异常,因为您正在使用损坏的事务来执行其他工作。 PostgreSQL默认阻止你这样做。
我们通过伪代码来提现一下这个错误:

获取数据库链接
try:
	错误的数据库操作A。
except Exception as e:
	logging.info("A is worng!!");
正确的数据库操作B。   # 此次数据操作有可能出现上面的错误。
事务提交commit。

值得注意的是:由于你捕获并忽略的A操作。所以反而正确的操作B会报错。所以当系统提示B操作报错时,不应该在B处找原因,而应该在B的上一条sql(操作A)去查找原因。

解决:

有以下几种可以尝试的解决方案:

  1. 在报错该错误的上一条sql操作中寻找解决方案。
  2. sql操作一般不需要捕获错误,如果一定要捕获可以先暂时去掉try except捕获。并调试代码A,待调试代码完成后在加上捕获错误的语句。
  3. 将语句A和语句B分开在两个事物中执行。但这样A和B事物的一致性就无法得到保证。

你可能感兴趣的:(PostgreSQL错误:ERROR: current transaction is aborted, commands ignored until end of transaction bloc)