Mysql的行锁机制
<!-- [if gte mso 10]>
以下内容来自网络,已测试。
结论:
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(0) default NULL,
PRIMARY KEY
(id),
KEY
asd (num)
) ENGINE=InnoDB
其中
num
字段加了索引
然后插入数据,运行,
insert into bo
相关文档:
要安装 MySQL,可以在终端提示符后运行下列命令:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install php5-mysql
// 安装php5-mysql 是将php和mysql连接起来
一旦安装完成,MySQL 服务器应该自动启动。您可以在终端提示符后运行以下命令来检查 MySQL 服务器是否正在运行: ......
今天给新来的员工连接数据库,修改了一下mysql root用户的密码,我下载的是打包的redMine,默认密码是空,修改密码之后重启redmine,phpAdmin 链接不上mysql数据库了,我也修改了phpadmin文件夹下的config.inc.php的密码,还是不行,提示#1130 - Host 'localhost' is not allowed to connect to this MySQL server错误,明 ......
mysql
服务器中有六个关键位置使用了字符集的概念,
他们是:
client
、connection
、database
、results
、server,
a
、其中client
是客户端使用的字符集,相当于网页中的字符集设置如下
<
meta http-equiv
=
"Content-Type"
content
=
"text/html;charset=utf ......
最近公司准备使用项目管理的网站DotProject,公司虽然不大,但是牵涉到的业务也是很复杂的,所以需要定时去保存数据库的信息以防止数据库崩溃或者其他的原因造成的数据损失,这样就需要进行数据库的备份。
DotProject使用的是Mysql数据库,备份Mysql数据库的一个比较好的方法就是 ......
Java代码
mysql> select version(),current_date;
查询mysql的版本号 和 日期
mysql> select version();
查询mysql的版本号
select now();
查询当前日期和准确的时间
Java ......