也来谈谈并发策略

   所有的多用户应用程序,包括Web应用程序,都存在多个用户同时执行查询和更新的可能。这会产生潜在的混淆状况,即当出现两个用户同时拥有某一行的状态时,他们会试图提交不同的更新。第一个用户的更新总会成功,而第二个用户的更新成功还是失败就要看你的并发策略了。

   理解并发管理最重要的一件事是并发策略由UPDATE命令和DELETE命令的写法决定(尤其是WHERE子句的形式)。

   以下列出几种最常用的例子。

   后到者胜出更新。这是不太严格的并发控制,它总是提交更新(除非原始行已被删除),每次更新提交后值总是被更新。如果数据冲突比较少,后到者胜出会很有用。例如:当只有一个人负责更新一组特定的数据时,就可以放心的采用这个方法。通常,实现后到者更新方法时,WHERE子句通过记录的主键与要更新的记录匹配。

   完全匹配更新。实现这个策略时,UPDATE语句需要使用所有你要设置的值以及所有的原始值。使用原始值可以构建WHERE子句找到原始记录。这样即使只有一个字段被修改了,记录也不会匹配,更新也就不会成功。这种方式的一个问题是相兼容的更新也被禁止。例如:两个用户同时更新同一记录的不同部分,尽管没有任何冲突,第二个用户的更新也会被拒绝。另外一个更为显著的问题是应用完全匹配的更新策略会导致冗长、低效的SQL语句。

   基于时间戳的更新。大多数数据库系统支持时间戳列,它是由数据源在记录有更新时自动更新的。你不需要手工更新时间戳列。但是,如果在执行SELECT语句时获取它,可以在UPDATE语句中使用WHERE子句,这样就可以保证只在它没有被更新时更新记录,这和完全匹配更新的效果一样。与完全匹配更新不同,WHERE子句更加简洁、高效,因为它需要两条信息------主键和时间戳。

   变化的值更新。这种方式尝试在UPDATE命令中只更新变化了的值,因此,只要用户同时更新的是不同的字段,它就允许两个用户同时做改动。问题时这种方式会很复杂,因为需要追踪哪些值变化了(要放到WHERE子句中),哪些值没变化。

   后到者胜出是完全没有并发控制的数据库访问的一个示例。完全匹配更新、基于时间戳的更新以及变化值更新是乐观并发的示例。对于乐观并发策略,代码不需要保持使用的数据的锁---相反,你的策略是希望变更不会重叠,并且如果发生则进行相应的处理。就涉及到事物的问题了,它允许实现悲观并发。悲观并发通过锁定使用中的记录防止并发冲突。平衡在于可扩展性,因为其他试图访问相同数据的用户将不得不等待。

posted @ 2012-05-29 10:43  爱智旮旯  阅读(479)  评论(0编辑  收藏  举报