MySQL中的事物

这篇具有很好参考价值的文章主要介绍了MySQL中的事物。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、背景

二、事物的概念

概念:

回滚:

三、事物的特性

1、原子性

2、一致性

3、持久性

4、隔离性

四、并发执行的三个典型bug

1、脏读

2、不可重复读

3、幻读

五、MySQL的隔离级别

1、read uncommitted 读未提交

2、read committed 读已提交

3、repeatable read 可重复读

4、serializable 串行化

都看到这了,点个赞再走吧


一、背景

10年前,银行转账的时候还会有一些bug,比如,你转账给某人,你钱已经转出去了,但是那个人却没收到钱,你的钱却是真的减少了,那么对于这种情况我们应对的方案是什么呢?

因此,我们不想让这两个操作单独执行,我们想把转账出去操作和收钱操作合并到一起,再一起执行这两操作,当前面转账出去后,收账的操作出现问题了,我们就要进行回滚操作,把转账那一操作回滚到还没转账时的情况。

因此,大佬们引出了事物这个概念,用事物把多个操作打包在一起。


二、事物的概念

概念:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

回滚:

当事物中某一个操作失败后,数据库是咋知道之前的数据呢?数据库是没有" Ctrl + Z "的。

数据库对于事物来说,使用特殊的机制undo log + redo log这两个是通过日志,println写到文件记录之前的数据的操作。

当数据库中间挂了,但是日志已经记录下来了,等到数据库重启之后,读取之前的日志,看看是否有这种执行一半的事物,如果有就会进行回滚操作,回到执行这个事物之前的操作。

优缺点:事物虽然让数据更靠谱了,但是执行效率也变低了。


三、事物的特性

1、原子性

通过事物,把多个操作打包到一起。(初心)

2、一致性

相当于原子性的延伸,当数据库中间出现问题,如“钱凭空消失”这种情况不会发生

另一方面,还可以通过约束,避免数据出现一些非法的情况

3、持久性

事物任何的修改,都是持久化存在的(写入硬盘的),无论是重启程序,还是重启主机,修改都不会丢失(数据库本身就是为了持久化存储)

4、隔离性

多个事物并发执行的时候,可能会带来一些问题,可以用过隔离性来对这里的问题进行权衡,看你是希望数据更准确,还是速度更快。


四、并发执行的三个典型bug

1、脏读

概念:有两个事物,事物1和事物2,事物1修改了某个数据,但是数据还没“提交”(“提交”的意思就是告诉服务器完毕,over的意思),事物2读取了同一个数据,事物2读的数据,可能就是脏的数据,因为事物1还没修改完,事物2就读了。

解决方案:给写加锁,即写的时候不能读,写完才能读。

2、不可重复读

概念:有两个事物,事物1修改数据,事物2读取数据(可能会多次读取数据),基于脏读,给写加锁后,事物2项读数据,只能等事物1修改完后才能读,但是这时有个事物3,也是修改同一个数据,那么修改了后,事物2在读的过程中,在执行事物3之前和之后,读取的两个数据不同。(如果读不同事物得到的数据不同,是符合逻辑的,但同一数据读到的结果不同,那就难受了)

解决方案:给读加锁,即读的时候不能改,降低并发程度,数据的准确性也就提高了

3、幻读

概念:基于脏读和不可重复读,给写加锁,也给读加锁了,现有2个事物(多次执行),事物1修改数据,修改完后,事物2读取同一个数据,但此时有个事物3,他不去修改前面的同一个数据,但是在同一张表里,他新增了一个数据,这就会导致新增前事物2读取的“结果集”和新增事物2后读取的“结果集不同”(结果集:查询的时候,有多少行)。

解决方案:串行化,不在进行任何并发了,每个事物都是串行执行(执行完第一个,再执行第二个,再执行第三个)。


五、MySQL的隔离级别

1、read uncommitted 读未提交

并行程度最高,隔离程度最低,效率最高,数据是最不靠谱的

可能会出现:脏读+不可重复读+幻读

2、read committed 读已提交

相当于给写操作加锁,并行程度降低了,隔离程度提高了,效率降低了,数据靠谱一些

可能会出现:不可重复读+幻读

3、repeatable read 可重复读

相当于给读操作和写操作都加锁了,并行程度降低了,隔离程度提高了,效率降低了,数据又更靠谱了。

可能会出现:幻读。

4、serializable 串行化

让所有事物都串行执行,并行程度最低,隔离程度最高,效率最低,数据最靠谱文章来源地址https://www.toymoban.com/news/detail-755722.html


都看到这了,点个赞再走吧

到了这里,关于MySQL中的事物的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MySQL】Navicat/SQLyog连接Ubuntu中的数据库(MySQL)

    🏡浩泽学编程 :个人主页  🔥 推荐专栏 :《深入浅出SpringBoot》《java对AI的调用开发》               《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 遇到一个Navicat/SQLyog连接Ubuntu中的数据库(MySQL)的报错:中文意思是不能在x.x.x.x(主机号)上连

    2024年02月21日
    浏览(41)
  • Mysql中的对数据库字段的数据进行加密

    注意点:此处只对name字段进行了字段类型的修改。 ENCODE(\\\'123\\\',\\\'123\\\'): 第一个123:表示插入数据库中的数据(即将要被转换的数据) 第二个123:表示转换秘钥,可以任意起名。在解密的时候会需要用到。 结果: 注意点1 :此处DECODE的两个参数分别为 需要解密的内容(数据库中

    2024年02月09日
    浏览(51)
  • 【MySQL数据库】看完还有谁学不会 MySQL 中的视图?

    在MySQL中,视图是一种虚拟表,它是由一个或多个基本表的行或列组成的。视图并不实际存储数据,而是根据定义的查询语句动态生成结果集。视图可以简化复杂的查询操作,提高查询效率,同时也可以保护数据的安全性,隐藏敏感数据。 视图是一种虚拟表,它是由一个或多

    2024年02月10日
    浏览(40)
  • MYSQL 查询数据库中所有表中的数据量

    SELECT TABLE_NAME, TABLE_ROWS  FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = \\\'your_database_name\\\'; 将 your_database_name 替换为您实际使用的数据库名称。 执行以上查询语句后,将会获取到 your_database_name 数据库中所有表的数据量,其中 TABLE_NAME 列表示表名称, TABLE_ROWS 列表示表中的数据量。

    2024年02月11日
    浏览(53)
  • Mysql数据库中的用户管理与授权

    ddl: create drop alter dml:对数据进行管理update insert into delete truncate dql:查询语句 select dcl:权限控制语句grant revoke create user \\\'用户名\\\'@\\\'主机\\\' identified by \\\'密码\\\' 加密 SELECT PASSWORD(\\\'密码\\\'); #先获取加密的密码 CREATE USER \\\'lisi\\\'@\\\'localhost\\\' IDENTIFIED BY PASSWORD \\\'加密的密码\\\';  select user(); grant all

    2024年02月07日
    浏览(37)
  • MySQL数据库干货_11—— MySQL中的非空约束(Not Null)

    非空约束(Not Null) 添加非空约束 使用DDL语句添加非空约束。 示例: 向 emp 表中的 salary 添加非空约束。 删除非空约束 使用DDL语句删除非空约束。 示例: 删除emp表中salary 的非空约束。 创建表时添加约束 查询表中的约束信息: 示例: 创建 depts 表包含 department_id 该列为主键且

    2024年02月07日
    浏览(37)
  • MySQL数据库中的索引(含SQL语句)

    假设有一张表,表中有100万条数据,这100万条数据在硬盘上是存储在数据页上的,一页数据大小为16k。存储100万条数据那么就需要数据页,假设其中有一条数据是“id为7900”的,那么如果要查询这条数据,其中SQL是SELECT * FROM 表名 WHERE id = 7900。在执行这条SQL语句的时候,MyS

    2024年02月02日
    浏览(60)
  • Mysql 查询数据库或数据表中的数据量以及数据大小

     许多数据库的元数据都是存储在mysql中的,例如hive、startrockes,因此可以通过mysql中的“information_schema.TABLES”表来查询对应数据库或对应数据表的具体信息。 1、查询各个数据库中的数据条数和数据大小 2、查询各个数据表中的数据条数和数据大小 3、查看指定数据库容量大小

    2024年04月27日
    浏览(34)
  • MySQL数据库中的存储过程以及存储函数练习

     字段名       数据类型       主键    外键    非空   唯一    自增       id             INT               是      否       是       是           否    name    VARCHAR(50)   否      否       是       否           否    glass   VARCHAR(50)     否   

    2024年02月15日
    浏览(33)
  • MySQL中的表与视图:解密数据库世界的基石

    🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于PHP专栏:MySQL的100个知识点。 🎉欢迎 👍点赞✍评论⭐收

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包