MySql锁详解
从数据库的操作粒度讲,可以分为表锁和行锁
表锁:当对表进行写操作时,锁住整个表
行锁:当对表进行写操作时,只锁住写操作的相关行
从数据读写的角度讲,可以分为读锁和写锁
读锁,又叫共享锁,对同一根数据资源,多个读操作可以同时进行而互不影响
写锁,又叫排它锁,针对同一根数据资源,当前写操作没有完成前,其它的读写操作被阻塞
一、表锁
在MySql中,一般表锁用MyISAM存储引擎。表锁锁定粒度大,开销小,加锁快,无死锁,发生锁冲突的概率最高,并发最低。
对于MyISAM存储引擎类型的表,当读操作时,会自动给涉及到的表加读锁,读锁不会阻塞其它进程对同一表的读请求,但会阻塞对同一表的写操作,只有当读锁释放后,才会继续执行其它进程的写操作;在执行增删改前会自动给涉及到的表加写锁,写锁会阻塞其它进程对同一表的读和写,只有当写锁释放后,才会执行其它进程的读写操作。
二、行锁
MySql中行锁一般使用InnoDB存储引擎,锁定粒度最小,开销大,加锁慢,会出现死锁,发生锁冲突的概率最低,并发度最高。目前应用比较广泛。
InnoDB存储引擎与MyISAM存储引擎的区别:InnoDB采用的行锁,可以最小粒度的进行锁定;InnoDB支出事务。、
由于InnoDB支持行锁支持事务,因此在并发处理事务时会引发 更新丢失、脏读、不可重复读、幻读问题。、
- 更新丢失:当两个或多个事务写同一个表中同一行时,由于每个事务都不知道其它事务的存在,就会发生丢失更新的问题,最后的一个事务的更新会覆盖掉其它事务所做的个更新。
- 脏读:一个事务正在对一条记录进行修改,并且事务还未提交,此时如果另一个事务也来读取同一条数据,此时读取的该条数据即为脏读数据。因为前一个事务有可能执行失败,会把做的修改操作回滚掉。
- 不可重复读:一个事务在某时刻读取某条件下的数据,在下一时刻下还是读该条件下的数据时有可能与上次读取的数据不一致,因为中途有可能其它事务提交了修改。即事务A读取到了事务B已经提交的数据,不符合隔离性。
- 幻读:某时刻事务A按指定条件检索数据,下一时刻,事务A还是按相同的条件检索数据,发现比上次检索到的条数增加了,因为有可能其它事务做了复合该条件的插入,并已提交,这种现象称为幻读。与不可重复读类似。
脏读、不可重复读以及幻读都是数据库读一致性问题,必须由数据库的事务隔离级别来解决,MySql的隔离级别如下:
数据库的隔离界别越严格,并发作用越小,但付出代价越大,因为很多事务就不能同时进行并发,从而进行串行执行了,不适合高并发。
在MySql中通过 使用下面语句查询隔离级别
>show variables like 'tx_isolation';
mysql默认用的隔离级别为读提交。
上一篇: oracle 查询并清除锁lock
下一篇: oracle查看那些表被锁