web级mysql - 小笔记

查询数据库的属性、包括引擎
show table status from we7;

查询数据库的表引擎
show ENGINES;

插入一百万条数据的对比:
InnoDB,每秒插入1000条数据左右没有时候会在600,一共15分钟
MYISAM,每秒能插入16万数据,一共用了27秒

mysql和myisam表都能支持表级锁

表级锁

//如果是读级别锁 在当前会话事务未提交的时候,其他会话可读不可写
lock table user_balance read;(读级别)
//如果是写级别锁 在当前会员事务未提交的时候,其他会话不可读也不可写
lock table user_balance write;(写级别)

行级锁只能innodb支持,也是mysql中的最小粒度梭们也是真正的事务锁。

行级锁

行级锁分为共享锁和排它锁。

共享锁 lock in share mode

select xx LOCK IN SHARE MODE
这样就打开了共享锁,凡是select取出来的行数据 只有该回话才可以修改,直到commit过后,其他的会话才能修改,但是过程当中其他会话可以读。

start transaction;
select * from user_balance where user_id=3 lock in share mode;
commit;

update user_balance set user_money = 10 where user_id=3;

行锁是索引级别的,不是记录级别的。(上面两条命令执行,如果user_id并非索引,那么该锁会自动转换为表级别锁)
导致:
update user_balance set user_money = 10 where user_id=4;
也无法执行。

start transaction;
//id为索引,正确锁住 实现行级锁索引级别
select * from user_balance where id=3 lock in share mode;
commit;

//依然不能修改 因为user_id不是索引
update user_balance set user_money = 10 where user_id=3;
//可以修改 因为id是索引
update user_balance set user_money = 10 where id=3;

排他锁 for update
打开了排他锁,其他会话依然不能改数据,但是可以普通的的读。如果另外一个会话也想加锁则会产生冲突。

start transaction;
//id为索引,正确锁住 实现行级锁索引级别
select * from user_balance where id=27 for update;
commit;

//可以正常查询
select * from user_balance where id=27;

//不能运行 因为被锁了
update user_balance set user_money = 100 where id=27;

排它锁是在给加锁的记录再次加锁的时候,就会出问题
//读都读不出来,需要上一个锁事务提交以后 才可以再次加锁
select * from user_balance where id=27 for update;

发布了65 篇原创文章 · 获赞 3 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/web_orange/article/details/77866014
今日推荐