【问题标题】:locking database table while deleting records - understanding "Read Committed" transaction isolation in postgresql删除记录时锁定数据库表 - 了解 postgresql 中的“已提交读”事务隔离
【发布时间】:2013-04-25 15:11:20
【问题描述】:

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

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

任何 cmets / 建议将不胜感激。

【问题讨论】:

  • 是 LuaSQL 吗?您可以提供/阅读文档吗? executesqlandreturntable 是什么?
  • hjpotter92,我正在使用 luasql...但认为 postgresql 中的设置更相关,因为 luasql 只是 postgresql 的驱动程序。我想我看起来更好地理解“已提交”背后的原则

标签: postgresql transactions lua


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多