事务隔离级别
一、数据并发问题
针对事务的隔离性和并发性,访问相同数据的事务在不保证串行执行的情况下会出现的问题
1、脏写:对于两个事务SessionA、SessionB,如果事务SessionA修改了另一个未提交事务SessionB修改过的数据,那就意味着发生了脏写。
2、脏读:对于两个事务SessionA、SessionB,SessionA读取了已经被SessionB更新但还没被提交的字段,之后若SessionB回滚,SessionA读取的内容就是临时且无效的。
3、不可重复读:对于两个事务SessionA、SessionB,SsessionA读取了一个字段,然后SessionB更新了该字段。之后SessionA再次读取同一个字段,值就不同了,意味着发生了不可重复读。
4、幻读:对于两个事务SessionA、SessionB,SessionA从表中读取了一个字段,然后SessionB在该表中插入了一些新的行,之后,如果SessIonA再次读取同一个表,就会多出几行。那就意味着发生了幻觉。
二、SQL中的四种隔离级别
严重程度:
脏写 > 脏读 > 不可重复读 > 幻读:都解决并发性会下降
舍弃一部分隔离性换取一部分性能:设置隔离级别,级别越低,并发问题越多
1、读未提交:在该隔离级别,所有的事务都可以看到其它未提交事务的执行结果。不能避免脏读、不可重复读、幻读
2、读已提交:一个事务只能看见已经提交事务所做的改变。可以避免脏读。但不可重复读、幻读问题仍然存在
3、可重复读:事务A在读到一条数据后,此时事务B对该数据进行了修改并提交,那么事务A再次读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。
4、可串行化:确保事务可以从一个表中读取相同的一行。在这个事务执行期间,禁止其他事务对该表执行插入、更新、删除操作。所有的并发问题都可解决,但性能十分低下。能避免脏读、不可重复读、幻读。
四种隔离级别都不允许脏写的问题。
不同隔离级别有不同的锁和并发机制,隔离级别越高并发性越差。
查看事务的隔离级别:select @@transaction_isolation
设置隔离级别是:GLOBAL(全局范围影响):当前已经存在的会话无效。只对执行完该语句之后产生的会话起作用
SESSION(会话范围影响):对当前会话的所有后续的事务有效。即在事务中间开启,不影响当前正在执行的事务,但对后续的事务有影响。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构