【MySQL】数据库———事务及bug的解决

举报
三三是该溜子 发表于 2025/05/05 10:34:10 2025/05/05
【摘要】 ​阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你!目录二:并发执行事务及Bug详解三:隔离级别四:实际运用(简述)一:事务1:场景引入2:“回滚”此时就引入了事务这一概念,“要么条sql语句都不执行,要么都执行”。注:这里的不执行其实还是执行了的,“回滚”(rollback),恢复回去,这里涉及到数据库的一种恢复机制(undo log , redo l...


阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你!

目录

二:并发执行事务及Bug详解

三:隔离级别

四:实际运用(简述)

一:事务
1:场景引入

2:“回滚”
此时就引入了事务这一概念,“要么条sql语句都不执行,要么都执行”。

注:这里的不执行其实还是执行了的,“回滚”(rollback),恢复回去,这里涉及到数据库的一种恢复机制(undo log , redo log)

3:恢复机制(undo log,redo log)
读法:(安度  老哥  , 瑞都 老哥)哈哈

恢复机制会在数据库运行的时候,把你的操作写成日志的形式(println)保存到文件中,当数据库挂了之后,重启数据库,数据库会检查日志中是否有只执行了一半或者没有执行完的操作,如果有,就会把之前的操作进行回滚

优缺点:事务保证了数据的准确性,但是牺牲了执行效率

4:事务的特点
(1)原子性:事务的出现,本质就是将“操作”进行打包(这是事务的核心特性)

(2)一致性:是原子性的延伸,当数据库出现问题的时候,避免出现像上述钱不翼而飞的情况,即要么都执行,要么都不执行,另一方面我们也会添加一些约束条件,来避免数据出现一些非法的情况

(3)持久性:事务的操作是被写入硬盘的(持久保存的),电源关机,重启程序,这些修改的额操作都不会消失,(数据库本身就是为了持久化存储而生的)

(4)可隔离性:当多个事务并发操作时,可能会带来一些情况,我们可以通过隔离性来进行权衡,偏向数据的准确性多一点,或者偏向执行效率

二:并发执行事务及Bug详解
1:场景引入
数据库是cs结构的,一个数据库会面向多个服务器,当多个服务器同时向数据库发出事务请求,这就叫做并发执行事务。如果多个服务器请求的是修改不同的表那还好,如果是修改相同的表的话就会出现一些Bug

Bug(1):“脏读”问题
①场景引入

②解决思路(给“写”上锁)

Bug(2):不可重复读
①场景引入(沿用Bug1的场景)

②解决思路(给“读”上锁)

Bug(3):幻读
①场景引入(沿用Bug2的场景)

②解决思路()

三:隔离级别
上述的的三种bug要根据实际开发情况来判定到底是否为bug,有的场景更注重与效率,有的场景更注重数据的准确性

1:read uncommitted(读未提交)
并行程度(高),隔离级别(低),效率(高),数据的准确性(低),可能会触发:“脏读”,“不可重复读”,“幻读”

2:read committed(读已提交)
并行程度(中),隔离级别(中),效率(中),数据的准确性(中),可能会触发:“不可重复读”,“幻读”

3:repeatable read (可重复读)
并行程度(低),隔离级别(高),效率(低),数据准确性(高),可能会触发:“幻读”

4:serializable(串行化)
并行程度(无了),隔离级别(最高),效率(最低),数据准确性(最准)

四:实际运用(简述)
1:start transaction(执行事务)

2:sql1,sql2,sql3语句进行打包

3:commit(告诉服务器,事务执行完毕)

4:roolback(告诉服务器,要进行回滚即开启事务后,执行的sql语句恢复回去)

roolback一般不会在控制台中执行,一般是在java代码中实现,先在代码中开启事务,控制执行sql语句(打包提交),结果某条sql语句报错,catch捕获异常,并且使用rollback(回滚)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。