mysql锁机制

 

 「表锁」是粒度最大的锁,开销小,加锁快,不会出现死锁,但是由于粒度太大,因此造成锁的冲突几率大,并发性能低。

Mysql的「MyISAM储存引擎就支持表锁」,MyISAM的表锁模式有两种:「表共享读锁」「表独占写锁」

当一个线程获取到MyISAM表的读锁的时候,会阻塞其他用户对该表的写操作,但是不会阻塞其它用户对该表的读操作;当一个线程获取到MyISAM表的写锁的时候,就会阻塞其它用户的读写操作对其它的线程具有排它性。

 

「行锁」是粒度最小的锁机制,行锁的加锁开销性能大,加锁慢,并且会出现死锁,但是行锁的锁冲突的几率低,并发性能高。==.>行锁是InnoDB默认的支持的锁机制,MyISAM不支持行锁.

=>行锁在使用的方式上可以划分为:「共享读锁(S锁)「和」排它写锁(X锁)」

当一个事务对MySQL中的一条数据行加上了S锁,当前事务不能修改该行数据只能执行读操作,其他事务只能对该行数据加S锁不能加X锁;若是一个事务对一行数据加了X锁,该事务能够对该行数据执行读和写操作,其它事务不能对该行数据加任何的锁,既不能读也不能写。

Mysql的「悲观锁的实现是基于MySQL自身的锁机制实现,而乐观锁需要程序员自己去实现的锁机制」,最常见的乐观锁实现就锁机制是「使用版本号实现」

 

 

MyISAM

MyISAM中默认支持的表级锁有两种:「共享读锁」「独占写锁」。表级锁在MyISAM和InnoDB的存储引擎中都支持,但是InnoDB默认支持的是行锁。

 

InnoDB行锁和表锁

InnoDB的行锁也是分为行级「共享读锁(S锁)「和」排它写锁(X锁)」

// 给查询sql显示添加读锁
select ... lock in share mode;
// 给查询sql显示添加写锁
select ... for update;

 加写锁lock table tableName write;-- 加读锁lock table talbeName read 

死锁的解决方案

(1)在程序的设计上,当发现程序有高并发的访问某一个表时,尽量对该表的执行操作串行化,或者锁升级,一次性获取所有的锁资源。

(2)置参数innodb_lock_wait_timeout,超时时间,并且将参数innodb_deadlock_detect 打开,当发现死锁的时候,自动回滚其中的某一个事务。

posted @ 2021-04-01 17:51  KLAPT  阅读(54)  评论(0编辑  收藏  举报