MySQL的锁(表锁与行锁)

1.锁

为什么需要锁?
在实际中,比如在淘票票抢电影票,A用户和B用户都想要要2排2座,那么它们必然只有一个人能抢到。在这个过程中,使用锁可以对有效的资源在并发的环境下进行保护,解决隔离和并发的矛盾。

什么是锁?
锁是计算机协调进程和线程在并发情况下访问某一资源的协调机制
在数据库中,数据是提供给多用户的共享资源,锁是用来保证资源的有效性和一致性



2.Mysql锁(MyISAM引擎)

MySql锁机制的特点是在不同的储存引擎下采用了不同的锁

MyISAM引擎下和Memory引擎下用的都是表级锁(table_level lock)

在这里插入图片描述
MyISAM表级锁的两种模式

    表共享读锁和表独占写锁
在这里插入图片描述

如何给表加锁?加锁后会有哪些影响?
表共享锁

在本会话中
在这里插入图片描述
在其它会话中
在这里插入图片描述



表独占锁

在本会话中

在这里插入图片描述
在其它会话中

在这里插入图片描述

总结:
在这里插入图片描述





3.MySQL锁(InnoDB引擎)

InnoDB引擎下采用的是行级锁(row_level lock)

行锁

共享锁又称,读锁。当一个事务对某几行上读锁时,允许其它事务对这几行进行读操作,但不允许其进行写操作,也不允许其它事务给这几行上排它锁(写锁),但允许上读锁。

排它锁又称,写锁。当一个事务对某几个上写锁时,不允许其它事务写(别的事务写其它行也会成为等待状态),但允许读,更不允许其它事务给这几行上任何锁。

在这里插入图片描述

测试在某行上排它锁后,其它会话在各类情况下的操作结果
在这里插入图片描述
当事务提交,COMMIT会进行锁的释放。

在这里插入图片描述



测试在某行上共享锁后,其它会话在各类情况下的操作结果
在这里插入图片描述

在这里插入图片描述

引入一道常见面试题:
在这里插入图片描述

正确的方法是,首先创建一张表和你预期更新后的表结构相同,然后把旧表的数据复制到新表中,并在数据库设置一个一个触发器,让旧表更新的数据更新在新表中,当全部同步后,执行一个把新表名改旧表,旧表删除的操作。

发布了30 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42549122/article/details/97497056