我有一个名为 as 的表'games'
,其中包含一个名为 as 的列'title'
,该列是唯一的,数据库用于PostgreSQL
我有一个用户输入表单,允许他'game'
在'games'
表中插入一个新表单。插入新游戏的功能会检查先前输入'game'
的相同游戏是否'title'
已经存在,为此,我得到count of rows
, 与相同的游戏'title'
。
我为此使用事务,开始时的插入函数使用BEGIN
,获取行数,如果行数为0,则插入新行,处理完成后,它COMMITS
会发生变化。
问题是,title
如果用户同时提交 2 个相同的游戏,有可能会被插入两次,因为我只是获取行数来检查重复记录,并且每个事务都是彼此隔离
我想在获取行数时锁定表:
LOCK TABLE games IN ACCESS EXCLUSIVE MODE;
SELECT count(id) FROM games WHERE games.title = 'new_game_title'
这也会锁定表以供读取(这意味着另一个事务必须等待,直到当前事务成功完成)。这将解决问题,这是我怀疑的。有没有更好的解决方法(避免games
重复title
)