Mysql悲观锁、乐观锁、隔离级别、共享锁、排它锁知识整理

文章介绍了事务在确保数据库操作的原子性、一致性、隔离性和持久性中的作用,特别指出InnoDB引擎对事务的支持以及其默认的可重复读隔离级别。同时,讨论了乐观锁和悲观锁的概念,前者适用于读多写少的场景,后者在写多读少时更为适用。此外,还提到了共享锁(读锁)和排它锁(写锁)的区别及其在并发控制中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、为什么要有事务?

事务是保证一组数据库操作,要么成功,要么失败。

在mysql中,MyIsam引擎不支持事务,Innodb才支持事务。事务是引擎层实现的。

事务有ACID,原子性、一致性、隔离性、持久性。

二、innodb事务默认隔离级别是什么?

MySQL InnoDB存储引擎默认的事务隔离级别是可重复读

三、事务隔离级别有哪些?

事务隔离级别有:

读未提交:A事务未提交commit时,B事务可以查看到更新的结果。

读已提交:A事务提交后,B事务才可以查看到更新的结果。

可重复读:在commit未处理的情况下,A在A事务在开始时和commit前再去查的数据一致。

串行化:顾名思义,就是A未提交时,B事务必须要等待A执行完才能执行。

四、请简述一下乐观锁和悲观锁

乐观锁:

乐观的认为操作不会冲突,即不上锁,在更新的时候再处理冲突问题。是通过业务逻辑处理。

通常乐观锁是通过version版本号或时间戳处理。

如下面的示例:

id

title

version_id

1

标题1

0

2

标题2

0

事务处理:

事务A

事务B

// 获取id=1的数据

Select id, title, version_id From t1 Where id = 1

// 获取的数据为id=1,title=`标题1`,version_id=0

// 获取id=1的数据

Select id, title, version_id From t1 Where id = 1

// 获取的数据为id=1,title=`标题1`,version_id=0

// 更新数据title=`标题3`

Update t1 Set title="标题3",version_id = version_id + 1 Where id = 1 And version_id=0

// 更新数据title=`标题4`

Update t1 Set title="标题4" ,version_id = version_id + 1 Where id = 1 And version_id=0

如上面例子,只有事务A的Update能处理成功,事务B的Update操作会处理失败。所以就达到一个乐观锁的效果。乐观锁适合读多写少的场景。

悲观锁:

悲观的认为操作都会冲突,所以在每次操作的时候都需要先获取锁才能对数据进行修改。与乐观锁比较,悲观锁比较适合写多读少的场景,因为锁会导致其他的事务都等待。

悲观锁是数据库自己实现了。悲观锁又分为共享锁和排它锁。

五、请简述一下共享锁和排它锁

排他锁又称为写锁,共享锁又称为读锁。

以下简称S锁和X锁:

X锁又分为表锁、行锁,X锁如果没命中索引或者主键索引的话,就是表锁。

X锁当S锁来获取的时候,需要等待X锁解锁之后才能获取到。

S锁当S锁来获取的时候,可以重复的读取,X锁来获取的时候会失败。

通过sql语句 for update来实现。

Select id, title From t1 Where id = 1 For Update

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值