https://blog.csdn.net/localhost01/article/details/78720727
https://blog.csdn.net/c466254931/article/details/53463596
https://www.cnblogs.com/zhanht/p/5431273.html
https://www.cnblogs.com/liaoweipeng/p/7615959.html
锁的基本概念
当多事务争取一个资源时,有可能导致数据不一致,这个时候需要一种机制限制,并且将数据访问顺序化,用来保证数据库数据的一致性,锁就是其中的一种机制。我们可以用商场的试衣间来做个比喻,商场里得每个试衣间都可供多个消费者使用,因此可能出现多个消费者同时试衣服需要使用试衣间,这时候就产生冲突了,为了避免冲突,试衣间装了锁(其实就是进去之后把门拴住),某一个试衣服的人在试衣间里把锁锁住了,其他顾客就不能再从外面打开了,只能等待里面的顾客,试完衣服,从里面把锁打开,外面的人才能进去(网上找到的比喻,非常形象)。不过我想要是并发了就尴尬了,哈哈。
行级锁 行级锁–>分为共享锁和排他锁
行级锁是Mysql中锁定粒度最细的一种锁,能大大减少数据库操作的冲突,
由于其粒度小,加锁的开销最大。
MySQL主要的两种锁的特性可大致归纳如下:
表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);
锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
MyIsam -----》只支持表级锁
Innodb -----》InnoDB存储引擎既支持行级锁( row-level locking),也支持表级锁,但默认情况下是采用行级锁。
共享锁又称为读锁,简称S锁
顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁又称为写锁,简称X锁
顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁
mysql InnoDB引擎默认的修改数据语句,
update,delete,insert都会自动给涉及到的数据加上排他锁,
select语句默认不会加任何锁类型,如果加排他锁可以使用select…for update语句,
加共享锁可以使用select … lock in share mode语句。
- 所以加过排他锁的数据行在其他事务种是不能修改数据的, 也不能通过for update和lock in share
mode锁的方式查询数据, 但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。
下面做实验验证上面的结论
show VARIABLES like 'autocommit';
设置自动提交事务为否
set autocommit = 0;
执行事务提交
COMMIT ;