我有一个名为'games'
,其中包含一个名为'title'
,该列是唯一的,数据库中使用PostgreSQL
我有一个用户输入表单,允许他插入新的'game'
in 'games'
桌子。插入新游戏的功能会检查之前输入的游戏是否存在'game'
与相同的'title'
已经存在,为此,我得到count of rows
,同样的游戏'title'
.
我为此使用事务,开始时的插入函数使用BEGIN
,获取行数,如果行数为0,则插入新行,处理完成后,COMMITS
变化。
问题是,有可能两场比赛有相同的title
如果用户同时提交,则会插入两次,因为我只是获取要检查重复记录的行数,并且每个事务都会isolated来自彼此
我想到了锁定表当获取行数时:
LOCK TABLE games IN ACCESS EXCLUSIVE MODE;
SELECT count(id) FROM games WHERE games.title = 'new_game_title'
这也会锁定表进行读取(这意味着另一个事务必须等待,直到当前事务成功完成)。这将解决问题,这正是我所怀疑的。有没有更好的方法来解决这个问题(避免重复games
与相同的title
)
在这种情况下您不需要锁定您的表。
相反,您可以使用以下方法之一:
- Define
UNIQUE
列的索引确实必须是唯一的。在这种情况下,第一个事务将成功,第二个事务将出错。
- Define
AFTER INSERT OR UPDATE OR DELETE
触发器将检查您的状况,如果不成立,则应该RAISE
错误,这将中止有问题的事务
在所有这些情况下,您的客户端代码应该准备好正确处理可能因执行语句而返回的失败(例如失败的事务)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)