义乌网站设计制作价格,wordpress页内跳转链接,微信小程序公司,线上商城是什么意思一、什么是锁粒度#xff1f;
锁粒度#xff08;Lock Granularity#xff09;是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围#xff0c;即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。
在MySQL中常见的锁粒度有
锁粒度Lock Granularity是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。
在MySQL中常见的锁粒度有表级锁、行级锁、页级锁。
因为更细粒度的锁可以允许更多的并发事务访问不同的数据资源所以锁粒度越小锁的竞争越小并发性能越高锁管理的开销越大。合理选择锁粒度可以帮助平衡锁的竞争和并发性能从而提高数据库的整体性能。
二、MySQL中常见的锁粒度类型
2.1、表级锁
描述锁定整个表阻止其他事务访问该表。用途适用于需要锁定整个表的场景例如 MyISAM 和 MEMORY 存储引擎。特点锁的竞争最小但并发性能较低。
2.2、行级锁
描述锁定特定的行而不是整个表。用途适用于需要锁定单个行的场景以减少锁的竞争。特点锁的竞争较大但并发性能较高。
2.3、页级锁
描述锁定数据页而不是行或整个表。用途适用于需要锁定数据页的场景例如在某些存储引擎中用于索引组织表。特点锁的竞争和并发性能介于表级锁和行级锁之间。
一般来说如果事务主要涉及读操作可以选择较大的锁粒度如表级锁以减少锁的管理开销。如果事务涉及大量写操作并且写操作通常是针对少量行的那么使用较小的锁粒度如行级锁可以提高并发性能。
三、如何设置锁粒度
在 MySQL 中锁粒度通常是由存储引擎自动管理的。不同的存储引擎支持不同类型的锁。通常不需要显式设置锁粒度通过选择合适的存储引擎和事务隔离级别来间接控制锁的行为。
3.1、选择存储引擎
InnoDB 存储引擎默认支持行级锁适用于需要高并发和事务安全的场景。MyISAM 存储引擎支持表级锁适用于读多写少的场景
3.2、选择事务隔离级别
READ UNCOMMITTED最低的隔离级别不使用行级锁可能导致脏读。READ COMMITTED使用行级锁允许并发读取但可能导致不可重复读。REPEATABLE READ默认使用行级锁禁止并发读取避免不可重复读。SERIALIZABLE最高隔离级别使用表级锁确保事务串行执行。
一旦表创建完成锁粒度就已经确定。如果需要更改锁粒度你需要重新创建表或使用不同的存储引擎。
四、锁模式
4.1、共享锁Shared LocksS锁
描述允许多个事务同时读取数据但阻止其他事务写入数据。用途适用于读取数据的场景。示例在 InnoDB 中SELECT ... LOCK IN SHARE MODE 会获取共享锁。
4.2、排他锁Exclusive LocksX锁
描述阻止其他事务读取或写入数据。用途适用于写入数据的场景。示例在 InnoDB 中SELECT ... FOR UPDATE 会获取排他锁。
4.3、意向锁Intention Locks
描述意向锁是一种特殊的锁用于指示事务打算获取的锁的类型。用途用于与其他锁协调以减少死锁的可能性。示例意向共享锁IS表示事务打算获取共享锁意向排他锁IX表示事务打算获取排他锁。
五、锁等待
5.1、什么是锁等待
锁等待Lock Wait是指在数据库事务处理中当一个事务请求锁定某个资源如行、页或表时如果该资源已经被另一个事务锁定则请求锁定的事务将进入等待状态直到资源解锁为止。这种等待状态称为锁等待。
5.2、锁等待的影响
并发性能锁等待可能会降低系统的并发性能因为等待的事务无法继续执行。死锁如果多个事务互相等待对方释放锁则可能导致死锁。
5.3、锁等待的检测与解决
InnoDB 存储引擎InnoDB 存储引擎会自动检测锁等待情况并在必要时报告锁等待状态。
等待超时可以通过设置 innodb_lock_wait_timeout 参数来限制等待锁的时间超过该时间后事务将回滚。死锁检测MySQL 会自动检测死锁并回滚其中一个事务以解决死锁。
5.4、锁等待的预防
合理的事务设计尽量减少事务的持续时间和锁定资源的数量。事务隔离级别选择合适的事务隔离级别以减少锁等待。锁的粒度使用更细粒度的锁如行级锁可以减少锁等待的机会。
六、死锁检测与处理
在执行需要锁定数据的操作时MySQL 会自动获取相应的锁。在事务提交或回滚时MySQL 会自动释放所有锁定的数据资源。
在 MySQL 中死锁是指两个或多个事务互相等待对方释放锁从而形成循环等待的情况。当这种情况发生时MySQL 会自动检测并解决死锁问题。
MySQL 会检测死锁情况当发现死锁时会自动回滚其中一个事务以解决死锁。MySQL 通常会选择回滚成本较低的事务以减少对系统的影响。
6.1、死锁检测
MySQL 的 InnoDB 存储引擎会自动检测死锁。InnoDB 使用了一个称为“等待图”的数据结构来检测死锁。每当事务请求一个新的锁时InnoDB 会在等待图中添加一条边表示事务正在等待锁。如果等待图中形成了一个环路则表明存在死锁。
6.2、死锁处理
当检测到死锁时MySQL 会采取措施来解决死锁。通常的做法是选择一个事务进行回滚以打破循环等待的情况。InnoDB 通常会选择回滚成本较低基于事务的大小、回滚成本和优先级等因素确定的事务以减少对系统的影响。