⑤. 表锁
- ①. 每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。
CREATE TABLE `mylock` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `NAME` VARCHAR (20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = MyISAM DEFAULT CHARSET = utf8; --插入数据 INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('1', 'a'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('2', 'b'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('3', 'c'); INSERT INTO`test`.`mylock` (`id`, `NAME`) VALUES ('4', 'd');
- ②. 手动增加表锁
lock table 表名称 read(write),表名称2 read(write);
- ③. 查看表上加过的锁
show open tables;
- ④. 删除表锁:unlock tables;
⑥. 行锁
①. 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高
②. innoDB与MYISAM的最大不同有两点:
InnoDB支持事务(TRANSACTION)
InnoDB支持行级锁
③. 一个session开启事务更新不提交,另一个session更新同一条记录会阻塞,更新不同记录不会阻塞
④. 读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
(InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。)
⑤. 死锁
set tx_isolation='repeatable-read'; Session_1执行:select * from account where id=1 for update; Session_2执行:select * from account where id=2 for update; Session_1执行:select * from account where id=2 for update; Session_2执行:select * from account where id=1 for update; -- 查看近期死锁日志信息:show engine innodb status\G; -- 大多数情况mysql可以自动检测死锁并回滚产生死锁的那个事务,但是有些情况mysql没法自动检测死锁