Postgresql 在postgres中删除返回:返回的行是否反映数据库的最终状态?

Postgresql 在postgres中删除返回:返回的行是否反映数据库的最终状态?,postgresql,sql-delete,Postgresql,Sql Delete,我有一个应用程序,其中有两个不同的线程试图访问postgres中“a_tbl”表中的某一行,如下所示: 线程1:删除一些行并返回其中的列task_id 线程2:更新某行中的列“task_id” 因此,查询如下 线程1:从报告id=X返回任务id的tbl中删除 线程2:更新任务集任务,其中报告id=Z 假设两个线程都试图删除/编辑同一行,以便在上述查询中X与Z相同。在这种情况下,线程1会在删除之前返回task_id的最终存在值吗 我担心由于并发性,delete可能会在开始执行之前看到某些内容,并返

我有一个应用程序,其中有两个不同的线程试图访问postgres中“a_tbl”表中的某一行,如下所示:

线程1:删除一些行并返回其中的列task_id 线程2:更新某行中的列“task_id”

因此,查询如下

线程1:从报告id=X返回任务id的tbl中删除 线程2:更新任务集任务,其中报告id=Z 假设两个线程都试图删除/编辑同一行,以便在上述查询中X与Z相同。在这种情况下,线程1会在删除之前返回task_id的最终存在值吗

我担心由于并发性,delete可能会在开始执行之前看到某些内容,并返回该内容。所以我相信更新可能在删除处理发生之前执行,然后,删除处理发生,并返回它之前看到的内容。大概是这样的:

已触发删除命令 已激发更新命令 删除任务\u id 40 更新任务\u id 50 删除删除删除该行 删除返回任务\u id 40
我担心得太多了吗

你太担心了。如果更新成功,则删除事务将看到新的任务id 50。假设默认隔离级别。如果删除事务返回40,则更新事务将失败。并且您可以随时进行测试。打开2个会话并手动尝试6个步骤。感谢@ypercube的回复。但是,手动尝试6个步骤是不可能的,因为我只能执行前2个步骤,步骤3-6不在我的控制范围内。您能否提供一些文档的链接以确认您的观点?您可以使用begin transaction更改步骤1和2;以及步骤5和步骤6中的提交;看看会发生什么。尝试上面的顺序和顺序1-2-4-3-6-5您还可以通过使用BEGIN TRANSACTION isolation LEVEL SERIALIZABLE开始您的事务,来支付各种隔离级别的费用;以及任何其他级别。你会发现你会得到不同的错误。有关详细信息,请参阅文档