SELECT
或INSERT
操作是否容易出现竞争条件?在您的PL/pgSQL函数中,您将数据插入Posts
表,并循环遍历标签以将其插入Tags
和Taggings
表。您担心当多个用户同时尝试删除标签和创建帖子时,此过程可能会遇到竞争条件。
在并发写入负载下,“SELECT
或INSERT
”的概念出现在尝试将新行插入表中,但又希望在该行已存在时检索它时。在SQL中,可以使用INSERT ... ON CONFLICT ... DO SOMETHING
语句实现这一点。
您的函数在将标签插入Tags
表时使用了此技术,但是如果另一个事务在您的事务提交之前删除了相关的标签,则可能会遇到竞争条件。为防止这种情况,请考虑以下技术:
SELECT
语句中,使用FOR SHARE
锁定现有行,确保其他事务在您的事务进行时无法修改它们。LIMIT
的UNION ALL
: 使用UNION ALL
查询组合SELECT
和INSERT
语句,在结果上使用LIMIT 1
子句。如果行已存在或插入成功,此技术允许快速退出。INSERT
函数: 将插入操作外包到单独的函数中。此函数应处理任何必要的异常处理,而主函数则专注于整体逻辑。通过实现这些方法之一,您可以防止函数中的竞争条件,并确保数据库中的数据完整性。
以上是PL/pgSQL 中并发的'SELECT”和'INSERT”操作会导致竞争条件吗?的详细内容。更多信息请关注PHP中文网其他相关文章!