易截截图软件、单文件、免安装、纯绿色、仅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 导入、导出数据库、表

mysql 导出表:
mysqldump -u 用户名 -p  --opt  数据库用户名 表名
> 表名.sql
mysql 导出数据库:
mysqldump -u
用户名 -p  --opt  数据库用户名
>
数据库
名.sql
mysql 导入表:
>source e:\base\pet.sql;
mysql 导入表数据:
>LOAD DATA LOCAL INFILE 'e:path/pet.txt ......

mySql 文本字段长度

BLOB
TEXT
一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。
MEDIUMBLOB
MEDIUMTEXT
一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。
LONGBLOB
LONGTEXT
一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。
可通过修改php.ini文件,改变最大长度设置。
; Valid range 0 - 2147483647.  ......

具有负载均衡功能MySQL服务器集群部署实现


具有负载均衡功能MySQL服务器集群部署实现
http://www.realure.cn/2009_241.html
http://www.realure.cn/2009_242.html
http://www.realure.cn/2009_243.html
http://www.realure.cn/2009_244.html
http://www.realure.cn/2009_245.html ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号