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

MySQL行锁深入研究

     
做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统。假设
id=1
的这本书库存为
1
,但是有
2
个人同时来借这本书,此处的逻辑为
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
引擎可以通过索引
对数据行加锁。以上借书的语句变为:
    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
。从而保证了第二个人不会读到第一个人修改前的数据。
那这样是不是万无一失了呢,答案是否定的。看下面的例子。
 
跟我一步一步来,先建立表

CREATE TABLE `book` (
`id` int(11) NOT NULL auto_increment,
`num` int(11) default NULL,
`name` varchar(0) default NULL,
PRIMARY KEY (`id`),
KEY `asd` (`num`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

其中
num
字段加了索引

然后插入数据,运行,

insert into book(num) values(11),(11),(11),(11),(11);
insert into book(num) values(22),(22),(22),(22),(22);

然后打开
2

mysql
控制台窗口,其实就是建立
2

session
做并发操作

********************************************************************
在第一个
session
里运行:


相关文档:

MySQL+PHP乱码原理与解决

本文从 http://tech.ddvip.com/2009-02/1235627800109815.html 装载,非常感谢作者!
MySQL+PHP产生乱码原因:
  ◆ MySQL数据库默认的编码是utf8,如果这种编码与你的PHP网页不一致,可能就会造成MySQL乱码;
  ◆ MySQL中创建表时会让你选择一种编码,如果这种编码与你的网页编码不一致,也可能造成MySQL乱码;
  ......

Django 使用MYSQL数据库 Latin1

      公司mysql统一用latin1的编码,真是叫人苦不堪言。Django用默认UTF8访问MYSQL数据库。在操作数据库时,不管你怎么转码,最终写到数据库里的中文都是乱码。在网上找了很久,也没解决这个问题。
      后来看了一个DJANGO的MYSQL操作的源码,发现了一些问题 先是/d ......

mysql内存表heap使用总结


内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制,以下是蓝草使用的一些感受。
1、heap对所有用户的连接是可见的,这使得它非常适合做缓存。
2、仅适合使用的场合。heap不允许使用xxxTEXT和xxxBLOB数据类型;只允许使用=和<=>操作符来搜索记录(不 ......

php+mysql编码问题总结

要不出现乱码,就要保持数据库和页面的编码格式一致.我全部使用utf-8的编码.
首先页面:
 1. 将文件用UE打开,将文件另存为UTF-8无BOM格式.很多编辑器都可用.
 2.使用 header("content-type:text/html; charset=utf-8"); 强制转换成utf-8的编码.
   也可以新建一个head.php,如下,在页面中用include( ......

Mysql 学习笔记

 显示所有数据库 show databases;
 创建数据库 create dababase stu;
 删除数据库drop database stu;
 切换到数据库use stu;
 取得当前的数据库,带()表示函数:select database();
创建表(要切换到数据库中)
mysql> create table stu_info(
   
-> stu_id int(8) ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号