1

我有一个网络应用程序,它将提供删除属于用户的小部件的功能。我现在进行删除的逻辑如下所示:

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 = "Deleted widget"
               else
                    retval = "Unable to delete widget"
               end
         else
               retval = "unable to delete widget"
         end 
   return retval
end

我想知道我是否应该将其更改为交易。现在,如果删除尝试由于某种原因失败,我什么也不做。我只是进行选择以查看它是否仍然存在,如果存在,我会抛出错误。

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

但我有以下问题:

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

  2. 如果我将其保留为默认值 - 根据我所阅读的内容是“已提交的” - 这将在我完成删除和选择命令时锁定小部件表,对吗?这意味着在此事务完成之前,没有其他人可以从小部件表中进行选择,对吧?鉴于我将拥有数百名用户,这听起来不是一件好事。

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

4

1 回答 1

1
  1. 不知道。
  2. 现代数据库允许您获取行级别的锁,而不必锁定整个表,这是非常低效的。所以在这种情况下,只有行级锁才会被获取,直到事务完成。这意味着其他用户将能够从表中进行选择,但只能选择未被您的事务锁定的行。

我不知道您为什么在删除该行后发出另一个选择。删除应该成功,否则查询将返回错误(例如,由于锁定超时)。没有必要再次检查。

因此,在这种情况下,不需要启动事务,因为 DELETE 隐式获取该行的写锁。除非自动提交被关闭,否则你无论如何都必须提交。

于 2013-04-25T18:30:04.400 回答