我有一个名为 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)