Fork me on GitHub

MySQL———锁机制

数据库锁的分类
  1. 按锁的粒度划分,可分为表级锁、行级锁、页级锁、InnoDB默认支持行级锁,同时支持表级锁,InnoDB对表上锁时,会先上表级别的意向锁。MyISAM只支持表级锁
  2. 按锁级别划分,可分为共享锁、排它锁
  3. 按加索方式划分,可分为自动锁、显示锁
  4. 按操作划分,可分为DML锁、DDL锁
  5. 按使用划分,可分为乐观锁、悲观锁(可用版本号,每次更新version+1,然后查询条件为version;时间戳)
常见问题

:memo: MyISAM与InnoDB关于锁方面的区别是什么

  1. MyISAM默认用的是表级锁,不支持行级锁
  2. InnoDB默认用的是行级锁,也支持表级锁

:memo:数据库事务的四大特性

事务ACID)

:memo: 事务隔离级别以及各级别下的并发访问问题

  1. 更新丢失—mysql所有事务隔离级别在数据库层面上均可避免,
  2. 脏读—READ-COMMITTED事务隔离级别以上可避免
  3. 不可重复读—REPEATABLE-READ事务隔离j级别以上可避免
  4. 幻读—SERIALIZABLE事务隔离级别可避免

事务的隔离级别)

:memo: InnoDB可重复读隔离级别下如何避免幻读

表象:快照读(非阻塞读) –伪MVCC

1
2
3
当前读:select...lock in share mode, select... for update
当前读:update,delete,insert
快照读:不加锁的非阻塞读,select

内在:next-key锁(行锁+gap锁)

:memo: RC、RR级别下的InnoDB的非阻塞读如何实现​

  1. 数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
表级锁

MyISAM:当对数据进行select时,表会加上表级的读锁,对数据进行增删改的时候,它会为我们表加上表级别的写锁,当读锁未被释放时,另外一个session向要对数据加上写锁,它就会被阻塞。值到所有的读锁都被释放。先读锁,后写锁,其他session可读,先写锁,后读锁,其它session不可读,先写锁,后写锁,其他session不可读,读锁是共享锁,写锁是排它锁.

1
2
3
lock tables 表名	read;	#读锁
unlock tables; #释放
lock tables 表名 write; #写锁
行级锁

InnoDB:当对数据进行select,行的数据默认不会添加读锁,这时另一个session的写锁可以commit;当对行数据添加了读锁后,另一个session的写锁不可以执行,被锁住了。当对不是同一行的数据进行操作时,不管加没加读锁,另一个session都可以读写。

1
select * from table where id=3 lock in share mode;	#上读锁

#####