我是C#的新手并遇到了这个问题:
我有一个.aspx
页面,可以接受参数eventId
。
首次使用特定eventId
请求此页面时,我需要在数据库中插入一些对该事件唯一的行。
在eventId
请求页面的所有其他时间,不应插入任何行。
我可以查询数据库以查看该事件是否已存在这些行,但这不会阻止并发问题。
比如说,2个客户端同时请求eventId = 7
的页面 - 该事件的行可能会插入两次。
如何使用Mutex / Lock / Monitor或其他任何东西来避免这种情况?
我需要通过字符串标识锁定机制 - 事件id
提前致谢...
答案 0 :(得分:1)
根据事件ID创建唯一索引。在您的asp页面上始终插入并处理插入失败的情况。如果插入失败,则事件id已被其他人使用。在这种设计中,db进行同步。
答案 1 :(得分:0)
“读取事件ID是否已经存在”和“插入事件ID”方法应该在事务中运行。 如果使用TransactionScope,则可以将隔离级别设置为Serializable,这将确保您永远不会在数据库级别进行并发访问,因此可以防止插入两次事件。
但是,我还会在数据库中的该字段上添加一个唯一的键索引,就像opi建议的那样。