• 欢迎来到我的博客
  • [email protected]

mysql 数据库 锁、事务隔离

学习笔记 tianlan 1年前 (2020-04-09) 231次浏览 0个评论 扫描二维码
文章目录[隐藏]

注意

  • MyIsam引擎在最新版本的MYSQL中已经废弃,如未特别声明,下文均指InnoDB
  • 锁只有在事务中才会生效,事务中会自动应用锁

提交模式

mysql 默认自动提交,使用事务需要手动开启事务(start transition 或 begin 命令),然后 commit 或 rollback。

如果关闭自动提交,那么久不需要手动开启事务,只需要 commit 或 rollback 即可。

事务隔离级别

事务隔离级别

脏读

不可重复读

幻读

说明

读未提交(read-uncommitted)

最低的事务隔离级别,一个事务还没提交时,它做的变更就能被别的事务看到

不可重复读(read-committed)

保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。

可重复读(repeatable-read)

多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改。事务在执行期间看到的数据前后必须是一致的。

串行化(serializable)

事务 100% 隔离,可避免脏读、不可重复读、幻读的发生。花费最高代价但最可靠的事务隔离级别。

一般设置成 可重复读 即可,既解决了脏读、不可重复读,又保证了性能。

设置成串行化的话,性能开销太大。

行锁 & 表锁

通过索引查询才能上行锁,否则上表锁

优化:作为查询条件的字段,需要建立索引

范围锁

BEGIN;
UPDATE goods SET num-200 WHERE id>1 AND id<3;

这个会把 id>1 和 id<3 的记录全部上锁

悲观锁 & 乐观锁

悲观锁

悲观锁分为两种,共享锁和排它锁。

共享锁

select * from test where id = 1 lock in share mode;
  • 允许其它事务也增加共享锁读取(如果其他事物不加共享锁,无法读取)
  • 不允许其它事物增加排他锁 (for update)
  • 当事务同时增加共享锁时候,事务的更新必须等待先执行的事务 commit 后才行(容易死锁的原因)

排它锁

其他事务不能读取被锁数据,并且不能更新

mysql 数据库 锁、事务隔离

乐观锁

其他事务可以读取被锁数据,但是不能更新。

需要自己实现:在表中添加一个 version 字段……

读锁 & 写锁

读锁和写锁都属于表锁,针对不支持事务的引擎(例如MyIsam引擎),所以这里不深入学习,仅做了解。

SELECT 会上锁吗

myisam 会,而 innodb 不会。


天蓝, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql 数据库 锁、事务隔离
喜欢 (1)
[[email protected]]
分享 (0)

您必须 登录 才能发表评论!