【发布时间】:2015-12-16 11:02:18
【问题描述】:
我有一个网络应用程序,用户通过单击“加入”按钮进行注册。网站上可以有这么多用户,这就是为什么为了保持我的数据库查询速度快;我选择不在数据库中添加foriegnkey约束(虽然它是关系数据库)。
现在,当具有相同 userId 的用户在两个不同的浏览器中打开应用程序并同时点击“加入”按钮时会发生什么情况;将同一用户的两行添加到数据库中,这是错误的。
我必须阻止这种情况的想法是:
- 在存储过程和 SQL 事务隔离级别为 SERIALIZABLE 的事务中执行检查/插入逻辑;但是使用这种方法,即使两个不同的用户同时点击“JOIN”按钮,表格也会被锁定。
- 在 c# 中使用 lock 关键字并在其中执行检查/插入逻辑,但我相信如果来自两个浏览器的同一个用户,他们将获得自己的锁,并且仍然能够在数据库中拥有两个条目。同样对于不同的用户,它可能会产生问题,因为其他人的代码会等待第一个释放资源。
- 使用 EntityFramework 开箱即用支持的乐观并发,但我不确定它是否能解决我的问题。
你能帮我解决这个问题吗?
【问题讨论】:
-
您可以创建一个插入触发器,它首先检查 id。如果存在,则从 SQL 中抛出一个错误,该错误应该向上传播,以便您在前端处理。
-
“来自两个浏览器的同一用户,他们将获得自己的锁” - 不,除非他们共享一个
AppDomain并且可以共享一个相同的lock变量 - 这不会发生。
标签: c# sql-server entity-framework concurrency database-concurrency