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
相关文档:
近日,有一个项目需要通过OA系统(Domino平台)向一个MySQL应用插入记录,因为平台是windows平台,所以采用了ODBC连接方式,在OA服务器上安装了MyODBC-3.51.11-1驱动,配置了ODBC驱动数据源之后,插入记录成功,但不论是插入中文内容,还是从MySQL中读取中文内容,都是乱码,在网上查阅了各种资料,初步 ......
MySQL 添加外键
DROP TABLE IF EXISTS `nation`;
CREATE TABLE `nation`(
`pii_Nation` smallint(2) unsigned NOT NULL default '0',
`pii_NatinoName` varchar(40) NOT NULL default '',
PRIMARY KEY (`pii_Nation`)
)ENGINE=InnoDB DEFAULT CHARSE ......
mysql
服务器中有六个关键位置使用了字符集的概念,
他们是:
client
、connection
、database
、results
、server,
a
、其中client
是客户端使用的字符集,相当于网页中的字符集设置如下
<
meta http-equiv
=
"Content-Type"
content
=
"text/html;charset=utf ......
最近公司准备使用项目管理的网站DotProject,公司虽然不大,但是牵涉到的业务也是很复杂的,所以需要定时去保存数据库的信息以防止数据库崩溃或者其他的原因造成的数据损失,这样就需要进行数据库的备份。
DotProject使用的是Mysql数据库,备份Mysql数据库的一个比较好的方法就是 ......
MySQL优化
同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月。MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。
安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql ......