Mysql锁

mysql锁是mysql为了保证数据的正确性(只允许一个进程操作数据)而做的一系列操作
1:mysql锁分类?

	按照锁粒度分为:行锁,页级锁,表锁

	常用的存储引擎中:innodb默认支持的是行锁,5.6之后的innodb也支持表锁。
				   Myisam采用的是表锁

	表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
	
	行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

	页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

	按照锁机制分为:排他锁,共享锁

	共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改

	排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取。

	

2:mysql锁导致的阻塞/死锁?

	阻塞:
	
		当数据库发生改变时,会对修改的表进行加锁(行锁/页锁/表锁),其他事物操作会等待锁释放才会继续执行
	
	死锁(产生的必要条件:互斥,占有且等待,不可抢占,循环等待):

		多个线程互相持有对方所需要的资源,导致这些线程一直处于等待中
	
		通俗易懂的理解:比如A和B两个人,一个厕所坑位,一卷卫生纸,A进厕所蹲坑去了,即A占有了坑,
		但是A没拿卫生纸,B拿了卫生纸后,B也想上厕所了,发现坑位有人了,那在门外等候,A占有了坑位
		,B占有了纸,A想得到纸,但是发现被B占了,都**没纸,怎么出来,B想上厕所,发现厕所被A占
		了,那**的怎么办,最后形成了僵持局面,A拿不到纸就占着坑不出去,B进不去坑我就拿着纸,然
		后两个就这样一直僵持着,形成了死锁

	死锁预防措施?

	除了互斥,破坏其他三个条件。为了数据的正确,互斥是必须的。

	


	
3:乐观锁,悲观锁?

	乐观锁:认为每次操作数据都不会对数据库表发生改变。很乐观,只是在更新这条数据的时候判断一下数据
	
	是否有冲突。

	实现原理:
	在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次
	,将那条记录的版本号加1。也就是先查询出那条记录,获取出version字段,如果要对
	那条记录进行操作(更新),则先判断此刻version的值是否与刚刚查询出来时的version
	的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,将
	version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值
	不相等,则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。

	悲观锁:认为每次操作都会对数据库发生改变,很悲观。所以每次操作都会对数据库进行加锁,耗费资源


	总结:两者各有优缺点。乐观锁适合多读的情况,如果业务修改异常频繁的话,只能用悲观锁保证数据

	的正确
	
	
	

	

### MySQL 机制详解 MySQL 中的机制是为了保障数据库在高并发环境下的数据一致性和稳定性而设计的重要功能之一。以下是关于 MySQL 机制的具体解析: #### 1. 的分类 MySQL 主要分为两种类型的:表级和行级。 - **表级 (Table-Level Lock)** 表级是最简单的定策略,适用于 MyISAM 存储引擎。它会在整个表上施加,无论是读操作还是写操作都会影响到整张表。对于 `SELECT` 操作,MyISAM 会自动给涉及的所有表加上读;而对于 `UPDATE`, `INSERT`, 和 `DELETE` 则会自动加上写[^3]。 - **行级 (Row-Level Lock)** 行级由 InnoDB 存储引擎实现,提供更高的并发能力。只有涉及到具体记录的操作才会触发行级。例如,在执行 `SELECT ... FOR UPDATE` 或者 `SELECT ... LOCK IN SHARE MODE` 时,InnoDB 只会对符合条件的特定行加而不是封整个表[^2]。 #### 2. 不同存储引擎的特性 不同的存储引擎有不同的行为: - **MyISAM**: 默认使用的是表级别的,这意味着即使是一个小范围内的更新也会阻塞其他线程对该表任何部分的访问[^3]。 - **InnoDB**: 支持事务以及更细粒度的行级,这使得它可以更好地处理复杂的多用户场景下的并发请求[^4]。 #### 3. 常见类型及其作用 除了基本的表级与行级区分外,还有几种具体的形式用于满足不同需求: - **共享 (Shared Lock, S-Lock)** 当一个客户端通过命令如 `LOCK TABLES table_name READ` 获取了一个表上的共享之后,其它客户也可以获得该表上的共享,但不能再获取排他直到当前持有共享的所有连接释放它们为止[^2]。 - **排他 (Exclusive Lock, X-Lock)** 排他允许独占式的修改权限。如果某个事务已经获得了某条记录或者某些列上的排他,则在此期间不允许别的事务再对此同一组资源申请任何形式的新——既包括另外的排他也包括新的共享[^2]。 - **GAP ** 这种特殊的用来阻止新纪录插入到现有两条连续记录之间的空隙(gap)里去。比如当我们运行下面这条SQL语句的时候就会用到gap lock:`SELECT * FROM table_name WHERE id > 10 FOR UPDATE;` - **Next-Key Lock** 是一种组合了索引记录本身(record)和其前面那个区间(gap)两者一起保护起来的一种复合型模式。主要用于解决可重复读(repeatable read)隔离级别下可能出现的幻影问题(phantom problem)[^4]。 #### 4. 死现象及预防措施 死是指两个或更多事务相互等待对方持有的资源从而进入僵局的状态。为避免这种情况发生可以采取以下方法: - 尽量按照固定的顺序访问资源; - 减少单次事务持续时间; - 设置合理的超时参数让系统能够及时发现并终止潜在的死循环状况等等[^4]。 ```sql -- 示例:如何手动解表 UNLOCK TABLES; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值