摘要: 引言作为多用户应用程序开发人员所面临的最为复杂的领域之一,基于服务器的系统必须处理好锁定策略的影响。如果实现得不好,将导致包括性能问题、死锁以及异常的应用程序行为等各类问题。本文的目的在于列出基本问题、常用策略和模式以及有关使用锁定策略的时机和方法的一般性建议。本文假设开发人员已经掌握所使用的 SQL,因而不会全面介绍使用对象关系(Object Relational,OR)映射工具的复杂细节。回页首事务锁定与会话锁定数据库管理系统在事务范围之内提供锁定机制。采用读取或更新锁可防止应用程序的不一致行为;锁的实际使用取决于开发人员使用的 SQL 语句类型以及在数据库连接中指定的隔离级别。但是,仅仅 阅读全文
posted @ 2010-12-13 17:54 玩玩乐乐 阅读(631) 评论(0) 推荐(0) 编辑
摘要: 丢失更新的定义:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其他事务的存在。最后的更新将覆盖由其他事务所做的更新,这将导致数据丢失。典型事务序列是: begin Transaction; select col_value into :var_col_value from tableA where keyid=:keyid; ...... var_col_new_value=var_col_value+1 update tableA set col_value=:var_col_new_value where keyid=:keyid; com 阅读全文
posted @ 2010-12-13 14:31 玩玩乐乐 阅读(475) 评论(0) 推荐(0) 编辑
摘要: 事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。应用程序要求的隔离级别确定了所使用的锁定行为:数据库在被广大客户所共享访问的操作过程中很可能出现以下几种不确定情况 :1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此 阅读全文
posted @ 2010-12-13 14:02 玩玩乐乐 阅读(762) 评论(0) 推荐(0) 编辑
摘要: Oracle的SelectForUpdate语句可以实现在读取数据后马上锁定相关资源,防止被其他session修改数据的目的。也就是我们常常谈到的“悲观锁定”(现实应用开发中,使用悲观锁定的情况少之又少,也许是因为乐观锁定的实现更加灵活和便捷的缘故)。这个小文儿做一个小小的实验,来看看Select For Update语句实现的行级锁定1.创建实验表table_sfu,并初始化三条数据sec@ora10g create table table_sfu (a number);Table created.sec@ora10g insert into table_sfu values (1);1 阅读全文
posted @ 2010-12-13 13:08 玩玩乐乐 阅读(5218) 评论(0) 推荐(0) 编辑
摘要: 近服务器上经常出现mysql进程占CPU100%的情况,使用show processlist命令后,看到出现了很多状态为LOCKED的sql。使用show status like 'table%'检查Table_locks_immediate和Table_locks_waited,发现Table_locks_waited偏大。出问题的表是MyISAM,分析大概是MyISAM的表锁导致。MyISAM适合于读频率远大于写频率这一情况。而我目前的应用可能会出现在某一时段读写频率相当。大致如下:一个客户端发出需要长时间运行的SELECT其他客户端在同一个表上发出INSERT或者UPDATE,这个客户将 阅读全文
posted @ 2010-12-13 13:07 玩玩乐乐 阅读(306) 评论(0) 推荐(0) 编辑