如果我有一个在数据库中保存数据的事务,但该事务是另一个事务的一部分,该事务需要该数据的id(fk)来创建新数据,但此时发生错误,所有事务都回滚还是只回滚最后一个事务?
它们都将回滚,除非您设置保存点。"交易中的交易"实际上是同一个事务。普通的ROLLBACK
将恢复所有内容,即使设置了保存点。ROLLBACK TO savepoint
只会撤销从该点开始发生的操作,保留之前生效的所有操作,仍然在同一个事务中。
下面是一个演示-观察表的状态与事务id的比较。
Psycopg2让你cur.execute('SAVEPOINT s1')
,然后cur.execute('ROLLBACK TO s1')
。