易截截图软件、单文件、免安装、纯绿色、仅160KB

MySQL行锁深入研究

来源:http://blog.csdn.net/ldb2741/archive/2010/02/25/5325161.aspx
做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统。假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为
view plaincopy to clipboardprint?
Select   restnum  from  book  where  id =1 ;      
-- 如果 restnum 大于 0 ,执行 update  
Update   book  set restnum=restnum-1 where id=1 ;  
Select   restnum  from  book  where  id =1 ;   
-- 如果 restnum 大于 0 ,执行 update
Update   book  set restnum=restnum-1 where id=1 ; 
问题就来了,当 2 个人同时来借的时候,有可能第一个人执行 select 语句的时候,第二个人插了进来,在第一个人没来得及更新 book 表的时候,第二个人查到数据了,其实是脏数据,因为第一个人会把 restnum 值减 1 ,因此第二个人本来应该是查到 id=1 的书 restnum 为 0 了,因此不会执行 update ,而会告诉它 id=1 的书没有库存 了,可是数据库哪懂这些,数据库只负责执行一条条 SQL 语句,它才不管中间有没有其他 sql 语句插进来,它也不知道要把一个 session 的 sql 语句执行完再执行另一个 session 的。因此会导致并发的时候 restnum 最后的结果为 -1 ,显然这是不合理的,所以,才出现锁的概念, Mysql 使用 innodb 引擎可以通过索引 对数据行加锁。以上借书的语句变为:
    view plaincopy to clipboardprint?
Begin;  
Select   restnum  from  book  where  id =1  for   update ;  
-- 给 id=1 的行加上排它锁且 id 有索引  
Update   book  set restnum=restnum-1 where id=1 ;  
Commit;  
Begin;
Select   restnum  from  book  where  id =1  for   update ;
-- 给 id=1 的行加上排它锁且 id 有索引
Update   book  set restnum=restnum-1 where id=1 ;
Commit;
这样,第二个人执行到 select 语句的时候就会处于等待状态直到第一个人执行 commit


相关文档:

关于MySQL数据量增加变化不大时,一种分页的优化方案

关于分页的优化。
我们知道,在MySQL中分页很简单,直接LIMIT page_no,page_total 就可以了。
可是当记录数慢慢增大时,她就不那么好使了。
这里我们创建摘要表来记录页码和原表之间的关联。
下面为测试数据。
原表:
CREATE TABLE `t_group` (
  `id` int(11) NOT NULL auto_increment,
  `money` decim ......

Mysql乱码

PHP 存取 MySQL 乱码问题
上一篇 / 下一篇  2007-06-04 03:33:50 / 个人分类:PHP学习
查看( 239 ) / 评论( 0 ) / 评分( 0 / 0 )
MySQL 的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表 ......

配置MySQL主从复制(Replication)


配置MySQL主从复制(Replication)
标签:知识/探索 mysql复制 replication mysql备份 
分类:数据库
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务 ......

mysql 1366错误,保存中文的方法

初学mysql我也碰到中文存储的问题,以下是我的解决方案:
 1.首先在字段选项column option 中将字段字符集column charset设为gb2312。
 2.还需要在表选项table option 中同样将charset设置为gb2312.
 3.最后如果还不行,就在mysql安装目录下找到my.ini,找到以下位置:
 [mysql]
 default-cha ......

SSH+MySQL开发中的中文乱码问题

一、表单提交乱码解决方法
    表单中含有中文提交乱码,对于字母和数字则不会乱码,我选用的字符集utf-8(以下同)。
 1、在apache-tomcat-6.0.18\webapps\examples\WEB-INF\classes\filters目录下找到文件SetCharacterEncodingFilter.java 和RequestDumperFilter.java文件,并将其复制到项目src ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号