在删除记录时锁定数据库表 - 了解PostgreSQL中的“已提交读取”事务隔离。

我有一个 Web 应用程序,将提供一个功能,允许用户删除属于他们的小部件。

我目前要执行删除操作的逻辑如下:

local delete_widget = function(widgetid, user)
   local retval = ""

         sql = "DELETE FROM widgets Where widgetid="..widgetid
         cur, err = assert(con:execute(sql))
         if not err then
               sql = "SELECT * FROM widgets where widgetid = ".. widgetid
               listofwidgets = executesqlandreturntable(sql)
               if #listofwidgets == 0 then
                    retval = "删除小部件"
               else
                    retval = "无法删除小部件"
               end
         else
               retval = "无法删除小部件"
         end
   return retval
end

我在想的是是否应该将其更改为事务。目前,如果出现任何原因导致删除尝试失败,我什么也不做。我只是选择查询以查看它是否仍存在,如果存在,则抛出一个错误。

我在想是否应该进行完整的开始事务/提交/回滚,以便如果选择语句发现小部件仍然存在,它将回滚删除 SQL 语句。

但是我有以下问题:

  1. 我如何使用 pgadmin3 检查我的事务隔离级别的当前值?

  2. 如果我将其保留为默认值-根据我所读到的是“读提交”-这将在我完成删除和选择命令时锁定 widgets 表,对吗?这意味着在事务完成之前,没有人可以从 widgets 表中选择,对吗?考虑到我将有数百个用户,这听起来不像是一件好事。

任何意见/建议将不胜感激。

点赞
用户2198692
用户2198692
  1. 不知道。
  2. 现代数据库允许在行级别上获取锁定,而无需锁定整个表格,这样高度低效。因此,在这种情况下,只有在事务完成之前才会获取行级锁定。这意味着其他用户将能够从表格中选择,但仅限于您的事务未锁定的行。我不知道您在删除行后为什么会发出另一个查询。删除应该是成功的,否则查询会返回错误(例如由于锁定超时)。没有必要再次检查。因此,在这种情况下,启动事务是不必要的,因为DELETE隐式地获取了该行的写锁。除非自动提交被关闭,否则您仍然需要提交。
2013-04-25 18:30:04