【MySQL】(2)MySQL锁机制总结

时间:2022-12-30 23:52:03

一、定义总结


1.乐观锁&悲观锁


悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。悲观锁的并发访问性不好。

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。 在乐观锁环境中,会增加并发用户读取对象的次数。



2.行锁&表锁&页锁


页级:引擎 BDB。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。
表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行。直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许。
行级:引擎 INNODB , 单独的一行记录加锁。仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。


3.共享读锁&独占写锁


共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。( Select * from table_name where ......lock in share mode)

排他锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和  排他写锁。(select * from table_name where.....for update)


4.事务(Transaction)及其ACID属性


原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全都不执行;
一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态;
隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行;
持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。


5.并发事务处理带来的问题


1、更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题
2、脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系
3、不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了
4、幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据



6.事务隔离级别


未提交读(Read uncommitted)最低级别,只能保证不读取物理上损坏的数据
已提交读(Read committed)语句级
可重复读(Repeatable read)事务级
可序列化(Serializable)*别,事务级



二、导图总结

【MySQL】(2)MySQL锁机制总结


     


       锁机制本质上是为了保证数据的一致性,为了满足不同的应用场景,各种锁定机制才会被设计出来。