3.4锁机制、事务
MySQL锁机制
锁:
读锁:共享锁,也称为s锁,只读不可写,包括当前事务,多个读互不阻塞
写锁:独占锁,排它锁,也称为X锁,写锁会阻塞其它事务(不包括当前事务)的读和写
举例:
读锁和读锁是兼容的,写锁和其它锁不兼容
事务T1获取了一个行r1的读锁,另外事务T2可以立即获得r1的读锁,此时T1和T2共同获得行r1的读锁,此种情况成为锁兼容
但是另外一个事务T3如果想获得行r1的写锁,则必须等待T1对行r1读锁的释放,此种情况也成为锁冲突。
锁粒度:
表级锁:MyISAM
行级锁:InnoDB
实现:
存储引擎:自行实现其锁策略和锁粒度
服务器级:实现了锁,表级锁,用户可显示请求
分类:
隐式锁:由存储引擎自动施加锁
显式锁:用户手动请求
锁策略:在锁粒度及数据安全性寻求的平衡机制
锁优缺点:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
对表date加读锁:lock table date read;
对表date加写锁:lock table date write;
事务:
有事务之前:
数据库修改一条数据是直接在内存中修改然后写入数据库文件
有事务之后:
数据库修改的数据先存入事务日志(告诉用户成功),然后再存入数据库文件
日志是顺序写的,更快(更详细),
事务特性
管理事务
显示启动事务
BEGIN
BEGIN WORK
START TRANSCATION
结束事务
COMMIT #提交
ROLLBACK #回滚
注意:只有事务型存储引擎中的DML语句才能支持此类操作
自动提交:set autocommit={1|0}
默认为1,为0时非自动提交
事务支持保存点
savepoint identifier
rollback work to savepoint identifiter
release savepoint identifiter
查看事务
查看当前正在进行的事务:select * frominformation_schema.innodb_trx;
查看当前锁定的事务:select * frominformation_schema.innodb_locks;
查看当前等锁的事务:select * frominformation_schema.innodb_lock_waits;
查看事务锁的超时时长,默认为50S:show global variables like 'innodb_lock_wait_timeout';
MySQL支持四种隔离级别,事务隔离级别:从上至下更加严格
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加读锁 |
读未提交 | 可以出现 | 可以出现 | 可以出现 | 否 |
读提交 | 不允许出现 | 可以出现 | 可以出现 | 否 |
可重复读 | 不允许出现 | 不允许出现 | 可以出现 | 否 |
序列化 | 不允许出现 | 不允许出现 | 可以出现 | 是 |
READ UNCOMMITTED
可读取到未提交数据,产生脏读
READ COMMITTED
可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致
REPEATABLE READ
可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改前的旧数据。此为MySQL默认设置
SERIALIZABLE
可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差
MVCC和事务的隔离级别:
MVCC(多版本并发控制机制)只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了