��ǰλ�ã�首页 > 集团企业

集团企业

不要使用SELECT FOR UPDATE

����:ʱ��:2019-04-13
在SELECT语句中声明游标时,请勿使用  FOR  UPDATE子句。适用情况A适用时适用。查看光标的代码并询问每个  SEL  ECT  FOR  UPDATE话语。使用  FOR  UPDATE子句锁定行,这会减慢事务的速度。关键点A游标是一种功能强大的结构,可以使编程更快更容易,同时还可以加速事务处理。但是,  FOR  UPDATE游标可能会长时间锁定数据,从而降低了事务速度。请参阅数据库文档,了解是否需要使用  FOR  READ  ONIY子句来最小化锁定数。 TR TR TR 如果使用得当,游标是一个非常强大的数据库控制结构,可用于遍历和处理由游标查询(或操作)定义的结果集中的数据。当您要指定数据集以遍历或遍历已处理数据集中的行时,游标非常有用。数据集中的数据项可以更新,删除,修改或读取,或由其他进程查看。游标的真正强大之处在于它们可以用作编程语言的扩展,因为许多过程和面向对象的编程语言不提供用于管理关系数据库数据集的内置功能。在高速事务处理系统中,使用SEL中的  FOR  UPDATE子句,ECP游标可能会导致问题甚至导致死锁。 TR TR 在许多数据库中,一旦打开带有  FOR  UPDATE子句的游标,语句查询的行将被锁定,直到会话中执行commit或rollback语句。  COMMIT语句将保存更改,  ROLLBACK语句将取消所有修改。执行这两个语句中的任何一个,将释放与数据库中的行相关联的锁。此外,执行commit或rollback语句后,您将丢失游标中的位置,并且无法再从游标中提取记录。 TRTR 暂停,你可以发现游标SELECT 或  UPDAI8E至少会导致两个问题吗?第一个问题是光标将在执行操作时保持数据库行的锁定。在许多情况下,这可能是有用的,即使在少数情况下,这也是不可避免的或最佳解决方案。但是,这些锁会导致其他事务在执行某些操作时阻塞或等待。如果这些操作很复杂或需要一些时间,那么很多待处理的事务都会堆积起来。如果这些事务恰好是要执行的游标执行  SELECT  FOR  UPDATE操作,那么我们可能会创建一个等待队列,并且队列的处理时间对用户来说是不可接受的。在Web环境中,让急躁的用户等待长响应将导致他们发出更多请求,并且可以更快地完成后续请求。结果是灾难性的,我们的系统将会关闭,因为挂起的请求堆在数据库端,这最终会导致Web服务器占用所有TCP端口并停止响应用户。 TR TR 第二个问题是早先提出的,是由第一个问题造成的。您必须等到上一个锁被清除,后一个游标可以锁定当前锁定的一个或多个行。请注意,光标可能无法添加这些锁。它们可以是用户添加的显式锁,也可以是  RDBMS添加的隐式锁。尽管需要一些锁,但数据库中的锁越多,事务累积的可能性就越大。长期锁定会导致频繁请求的数据响应时间变慢。某些数据库(例如  Oracle)具有可选的Tiankey NOWA 以释放控制权。 TR 让进程执行其他工作或等待再次获得锁定。但是,如果游标必须处理一些同时发生的客户端请求,则最终结果对于用户来说是相同的,也就是说,客户端请求必须等待很长时间才能获得响应。 TRTR 请注意,默认情况下,某些网站生产数据库在游标中使用  FOR  UPDATE子句。实际上,ANSI SQL标准指示任何游标必须默认使用  FOR  UPDATE子句,除非它使用  DECLARE语句中的  FOR  READ  ONLY子句。开发人员和DBA应该参考他们的数据库文档来了解如何使用最小的锁来开发游标。 TR TR
���ű�ǩ: