|
1
3
您正在描述一个非常常见的问题。 解决这一问题的正常方法是使用 Optimistic Concurrency Control .
问题 当有多个写入程序时,两个更新的读写部分可能会交错。假设有A和B,它们都读取并更新数据库中的同一行。A读取数据库,B读取数据库,B更新数据库,A更新数据库。如果你有一个天真的方法,那么“最后一次写入”将获胜,而B的写入可能会被销毁。 信任但核实 几年前的军备控制方法。实现这一点的方法是在数据库表中包含一个字段,该字段也必须包含在域对象中,它提供了一种区分db行或域对象的一个“版本”与另一个“版本”的方法。最简单的方法是使用一个名为lastUpdate的时间戳字段,它保存上次更新的时间。还有其他更复杂的方法来进行一致性检查,但时间戳字段适合用于说明。 然后,当编写器或更新程序想要更新数据库时,它只能更新键匹配的行(无论您的键是什么) 而且 由于开发人员理解代码,我将提供一些伪SQL。假设您有一个博客数据库,每个博客条目都有一个索引、一个标题和一些文本。您可以检索一组行(或对象)的数据,如下所示:
这种查询可能检索数据库中某一天、某个月或任何时间的所有博客文章。 使用简单的乐观并发,您可以更新 一排 像这样使用SQL:
只有当索引匹配(我们假定这是主键),并且LastUpdated字段与读取数据时的字段相同时,才能进行更新。还要注意,您必须确保为行的每次更新更新更新LastUpdated字段。 更严格的更新可能会坚持所有列都没有更新。在这种情况下,根本没有时间戳。大概是这样的:
OCC被用作保持数据库锁的替代方法,这是一种保持数据一致性的高压方法。DB锁可能会阻止 在保留db行的同时读取或更新db行。这显然具有巨大的性能影响。因此,OCC放松了这一点,并采取了“乐观”的行动,假定当需要更新时,表中的数据在此期间不会被更新。当然,这不是盲目乐观——你必须在更新之前检查。
possible within the Visual Studio design experience .
DataAdapter.RowUpdated event . (请注意,在ADO.NET模型中,每种数据库都有不同的DataAdapter。这里的链接是针对SqlDataAdapter的,SqlDataAdapter与SQLServer一起工作,但是对于不同的数据源,您需要不同的DA。) 在RowUpdate事件中,您可以检查受影响的行数,然后在计数为零时采取一些措施。 总结 在写入更新之前,请验证数据库的内容是否未更改。这叫做 乐观并发控制 .
|
|
|
mflame · 新安装的weblogic带有rcu和soa崩溃 8 年前 |
|
|
m.genova · 在AS/400上集成RPG有哪些技巧和窍门? 10 年前 |
|
|
Zirous Tom · 新SOA服务器的不可恢复系统故障 10 年前 |
|
|
user3587754 · Web服务和企业消息系统之间的区别是什么? 10 年前 |
|
|
latefreak · Python+Tornado用于会计软件 11 年前 |
|
|
rednerus · 使用WCF的面向服务的体系结构 11 年前 |
|
Datageek · YARN作为SOA框架 12 年前 |