1

我正在测试 postgresql 中 SELECT 和 SELECT FOR UPDATE 之间的差异。我注意到 SELECT 语句的一件事是,当发生锁或争用时,postgresql“似乎”正在悄然消亡。考虑以下脚本:

require("luasql.postgres")

-- GLOBAL DECLARES --
local con
local env
local databasename = "XXXX"
local databaseUser = "XXXX"
local databasepassword = "XXXX"
local databaseserver="xx.xx.xx.xx" 
local databaseport = 5432 

local databaseconnect = function()
   if not con then
      -- create environment object   
      env = assert (luasql.postgres())
      con = assert (env:connect(databasename, databaseUser, databasepassword, databaseserver))   
      return true
   else
      return false 
   end
end

local escape = function(sql)
     sql = sql or ""
     return con:escape(sql)
end

local databasedisconnect = function()
   if env then
      env:close()
      env = nil
   end
   if con then
      con:close()
      con = nil
   end
end

local userid, servername = ...

--CONNECT TO DATABASE
if not con then databaseconnect() end

print(now)
sql = "UPDATE tbl_availablenumbers SET UsedYesNo = true, user_id="..userid..", updateddatetime='"..os.date("%Y-%m-%d %H:%M:%S").."' WHERE reservationnumber =("
      .."SELECT reservationnumber FROM tbl_availablenumbers WHERE UsedYesNo=false Order By id ASC Limit 1 ) RETURNING reservationnumber"

print('Attempting to update tbl_availablenumbers table...')
assert(con:execute(sql))       

--DISCONNECT FROM DATABASE
if con then databasedisconnect() end
print("Goodbye")

我假设如果在更新不起作用的情况下出现某种故障,postgresql 将返回一条消息。

这就是我正在做的事情。我为上述逻辑创建了一个包装脚本,它将调用它 X 次。现在,我尝试运行它 100 次。然后我从 2 个不同的服务器对同一个数据库运行这些脚本。我知道存在失败/锁定问题,因为在两条语句运行后,我总共没有 200 条记录。例如,会话 1 创建了 99 和其他 65。我的问题是为什么我没有收到有关丢弃交易的通知?我读了一些关于 NOWAIT 子句的内容。这有关系吗?我对 postgresql 还不太熟悉,并且一直在将它与 mysql 和 ms sql server 等其他数据库进行比较,其中有一个配置设置定义了在竞争条件下等待多长时间。

也许我需要的只是NOWAIT。但我想与可能有更多经验的人确认一下。谢谢。

4

0 回答 0