我有一个 Web 应用程序,用户通过单击“加入”按钮进行注册。网站上可以有这么多用户,这就是为什么为了保持我的数据库查询速度快;我选择不在数据库中添加 foriegnkey 约束(虽然它是关系数据库)。
现在发生的情况是,当具有相同 userId 的用户在两个不同的浏览器中打开应用程序并同时点击“加入”按钮时;将同一用户的两行添加到数据库中,这是错误的。
我必须阻止这种情况的想法是:
- 在存储过程和 SQL 事务隔离级别为 SERIALIZABLE 的事务中执行检查/插入逻辑;但是使用这种方法,即使两个不同的用户同时点击“JOIN”按钮,表格也会被锁定。
- 在 c# 中使用 lock 关键字并从其中执行检查/插入逻辑,但我相信如果来自两个浏览器的同一个用户他们将获得自己的锁并且仍然能够在数据库中有两个条目。同样对于不同的用户,它可能会产生问题,因为其他人的代码将等待第一个释放资源。
- 使用 EntityFramework 开箱即用支持的乐观并发,但我不确定它是否能解决我的问题。
你能帮我解决这个问题吗?