myql的锁
本文主要涉及以下几个个部分: 1. 为什么要加锁 2. 锁的分类 3. 常见语句的加锁分析 4. 如何分析死锁 5. 如何预防死锁 先列出本地的运行环境 数据库版本是5.7,隔离级别是Repeatable-Read(可重复读),不同的数据库版本和隔离级别对语句的执行结果影响很大。所以需要说明版本和隔离级别 一、为什么要加锁 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中加锁是为了保证数据库的一致性。 数据库有ACID原则,其中I是隔离性, 脏读:读未提交的数据 不可重复读:读已修改的数据 虚读:读提交了插入/删除的数据 事务隔离机制 和标准SQL规范相比,MySQL中可重复读解决了幻读,实现了串行化隔离级别的功能,同时没有严重影响并发。是通过加锁、阻止插入新数据,来解决幻读的。 二、锁的分类 锁 我们听说过读锁、写锁、共享锁、互斥锁、行锁等等各种名词,简单对这些锁进行了分类。 锁的分类 加锁机制: 1、乐观锁:先修改,保存时判断是够被更新过,应用级别 2、悲观锁:先获取锁,再操作修改,数据库级别 锁粒度: 表级锁:开销小,加锁快,粒度大,锁冲突概率大,并发度低,适用于读多写少的情况。 页级锁:BDB存储引擎 行级锁:Innodb存储引擎,默认选项 兼容性: S锁,也叫做读锁、共享锁,对应于我们常用的 select * from users where id