mysql 行锁作用,MySQL行锁深入研究

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(20) default NULL, //原贴是varchar(0)应该是笔误,这里tenfy改成varchar(20)

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 做并发操作

*************************************

相关文档:

这时间在安装PHPBB的论坛,发现一个问题,那就是输入用户名跟密码后,点击安装,总是报了以下的错误:

程序代码

ORA-28008: invalid old password

Cause: old password supplied is wrong; Hence user cannot be authenticated using old password

Action: Supply the correct old password for authenticatio ......

Mysql中文乱码问题

之前被mysql中总是出现中文乱码搞得云里雾里,在网上也搜了些相关资料,可结果更让我觉得字符集的转换是相当复杂,甚至有了抵触心理,不过还好在最后搜到几篇经典的文章,经过研读总算明白过来!好文章,不敢独享,现将文章稍作整理与大家分享。

字符集基本概念:

http://home.phpchina.com/space.php ......

在MySQL中,对于索引的使用并是一直都采用正确的决定。

简单表的示例:

create TABLE `r2` (

ID` int(11) DEFAULT NULL,

ID1` int(11) DEFAULT NULL,

CNAME` varchar(32) DEFAULT NULL,

KEY `ID1` (`ID1`)

) ENGINE=MyISAM DEFAULT charSET=latin1

select count(*) from r2;

......

Accessing Distributed Data with the Federated Storage Engine

http://dev.mysql.com/tech-resources/articles/mysql-federated-storage.html

Federated存储引擎可以使几台数据库逻辑上组成一个数据库,其作用相当于Oracle的数据库链接,通俗地说,即在本地建立远程的数据库表的引用。

Mysql需要5.0以上

(1)查看是 ......

轉自花開的地方

mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysql启动

的时候加入一些参数。

如果在my.cnf里面修改,需增加如下几行

long_query_time = 1

log-slow-queries

=

log-queries-not-using-indexes

long_query_t ......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值