我正在测试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将返回一条消息。
这就是我正在做的事情。 我已经为上面的逻辑创建了一个包装器脚本,它会多次调用它。现在,我尝试运行100次。然后我从2个不同的服务器对同一个数据库运行这些脚本。 我知道有失败/锁定问题,因为在两个语句运行后,我没有总共200条记录。会话1创建例如99和其他65。 我的问题是为什么我没有通知掉线交易? 我读了一些关于NOWAIT子句的内容。这与它有关吗? 我对postgresql还不太熟悉,并且已经将它与其他数据库(如mysql和ms sql server)进行比较,其中有一个配置设置定义了在竞争条件下等待多长时间。
也许我只需要NOWAIT。但我想与可能有更多经验的人确认一下。 谢谢。