在上一次的教程中,我们处理了关联数据问题。这个教程演示如何处理并发问题。你将使用Department实体创建一个页面,这个页面在支持编辑和删除的同时,还可以处理并发错误。下面的截图演示了Index页面和Delete页面,包括在出现并发冲突的时候提示的一些信息。
一、并发冲突
并发冲突出现在这样的时候,一个用户正在显示并编辑一个实体,但是在这个用户将修改保存到数据库之前,另外的一个用户却更新了同样的实体。如果你没有通过EF检测类似的冲突,最后一个更新数据的用户将会覆盖其他用户的修改。例如,一个大客户有不同的部门下订单。部门1打电话给员工1下订单。几个小时后,部门1又打电话给员工1修改订单。同时,部门2打电话给员工2修改同一个订单,添加一些产品。两个员工同时检索该订单,员工1修改了一些details,添加了几个并且保存订单。员工2移除一个detail,1分钟后保存订单。这两个员工不会意识到存在问题,最终将错误的货物交付给客户。
在一些程序中,这样的风险是可以接受的,如果只有很少的用户,或者很少的更新,甚至对数据的覆盖不是真的很关键,或者解决并发的代价超过了支持并发所带来的优势。在这种情况下,你就不需要让你的程序支持并发冲突的处理。
1.悲观并发(锁定)
如果你的应用需要在并发环境下防止偶然的数据丢失,一种方式是通过数据库的锁来实现。这种方式被称为悲观并发。例如,在从数据库中读取一行数据之前,可以申请一个只读锁,或者一个更新访问锁。如果你对数据行使用了更新访问锁,就没有其他的用户可以获取不管是只读锁还是更新访问锁,因为他们可能获取正在被修改中的数据。如果你使用只读锁来锁定一行,其他用户也可以使用只读访问,但是不能进行更新。
时间: 2024-10-05 20:13:11