“必读”开发者必读!轻松学习如何使用MySQL事务
“这里是云源IT,帮你轻松学IT”
嗨~今天过得怎么样?
不管你现在有多不开心
你必须相信
明天会比今天更好
– 2023年11月29日-
在日常开发中,我们经常会遇到需要同时处理多个操作的情况。例如,在购物时,我们需要同时完成支付和库存更新两个操作。这时候如果其中一个操作失败了,我们就需要回滚来保证数据的一致性。
那么,如何在MySQL中实现这样的功能呢?答案是事务——。我们来介绍一下什么是MySQL事务?它是如何使用的?
一、什么是事务?
交易定义
事务是不可细分的最小工作单元;通常一笔交易对应一个完整的业务(如银行转账业务,它是最小的工作单元)。一个完整的业务需要批量的DML(插入、更新、删除)语句一起完成。事务只与DML语句相关,或者说只有DML语句才有事务。这与业务逻辑有关。不同的业务逻辑有不同数量的DML语句。
什么是交易?
通俗地说,一笔交易是一个整体,里面的内容要么全部执行成功,要么全部都不成功。不可能有一部分执行成功,一部分执行不成功。
也就是说,如果单元中的一条SQL语句执行失败或者出现错误,整个单元就会回滚(回到原来的状态)。所有受影响的数据都会恢复到事务开始之前的状态,但是如果单元中的所有SQL语句都执行成功,那么事务就会执行成功。
比如有一个订单业务:
1. 向订单表添加一条记录2. 更新(减少)产品数量数据3…
当多个任务同时操作时,这些任务只能同时成功或同时失败。
二、事务的特性
事务有四个特性:一致性、持久性、原子性和隔离性。我们分别解释一下这四个特征的含义。
原子性
事务是一个完整的工作单元,要么同时成功,要么同时失败。例如:当两个人发起转账业务时,如果A发起转账,但B由于某种原因无法成功接受,则交易最终不会提交,A和B的请求都不会成功。
坚持
一旦事务成功提交,它对数据库中数据的更改将是永久性的,后续的操作或失败不应该对其产生任何影响。
隔离
一个事务的执行不能被其他事务干扰,即一个事务内使用的操作和数据与其他并发事务隔离,并发执行的事务之间不能互相干扰。
一致性
事务执行并接收后,数据库的完整性不会被破坏。
注意:当前三个属性全部满足才能保证事务的一致性。
脏刷:为了保证存储效率,MySQL首先会将每次要读写的文件存储在缓存池中。数据操作在缓存池中进行,MySQL会定期刷新到磁盘。
三、事务的使用
事务如何保证操作的完整性?
事实上,如果事务执行过程中出现错误,只需要将事务中的操作恢复到之前的状态即可。这里涉及到的一项操作就是回滚。
事务处理是MySQL必须批量执行的操作的管理机制。在交易过程中,除非整批操作都正确执行,否则中间任何操作出现任何错误都会回滚到原来的安全状态。确保没有对系统数据进行错误的更改。
相关语法:
— Start transaction 开始交易; — 执行多个sql — Commit/rollback 事务提交/回滚;注意:启动事务后,执行的sql不会立即执行,只有在commit操作后才会统一执行(保证原子性)。
您还在为找不到真正免费的编程学习平台而烦恼吗?你可以试试云断元香!课程视频、在线书籍、在线编程、实验场景模拟、一对一咨询……无论您是初学者还是经验丰富的开发人员,这里都有您需要的一切。最重要的是,所有资源都是完全免费的!点击这里立即开始您的学习之旅!
例子:
首先创建账户表并初始化数据,
首先我们看一下正常情况下的转账操作。
如果操作过程中出现异常情况,例如SQL语句中的注释格式不正确,导致SQL执行中断。
观察结果发现,张三的账户少了2000元,但李四的账户余额却没有增加。在实际操作中,此类与金钱相关的操作失误可能会造成很大的损失。
为了防止这种错误的发生,我们可以使用事务来封装这些操作。
观察这里的结果,我们发现当前数据库用户查询的账户表中的账户余额发生了变化,但是启用事务后,只是commit前的临时预操作,并不会真正修改账户表中的数据桌子。
您可以退出数据库并重新打开数据库来重新查询表中的数据或切换用户查询来验证表中的数据是否发生变化。这里不再演示。
当前用户发现操作结果异常后,需要恢复到事务前的状态,即执行回滚操作。
如果启动交易后,我们发现预操作的结果是预期的效果,此时就可以提交交易了。当我们提交交易后,数据才真正被修改,即硬盘中存储的数据真正发生了变化。
需要注意的是,交易并不是万能的。不保证删除表或数据库后可以完全恢复。然而,使用具有适当数量的数据和操作的事务可以避免一些问题。
回滚操作实际上就是我们反转事务中的操作。首先是插入,回滚是删除……
这些操作非常昂贵,可以节省,但不能无限期地节省。最多保存正在执行的交易,无法保存附加内容;如果数据库有数十亿条数据,就会占用很大的空间。几百GB的硬盘空间,不可能花几TB甚至更多的空间来记录这些数据是怎么来的。
四、事务的并发异常
但是,由于不可能总是在某一时刻只有一个事务在运行,因此A可能正在操作文本表中的数据,而B也在操作文本表。
那么就会出现并发问题。对于同时运行的多个事务,当这些事务访问数据库中的相同数据时,如果不采用必要的隔离机制,就会出现以下并发问题。
1.脏读(未提交的读)
脏读:事务A读取了该事务已修改但未提交的数据。这种数据被称为脏数据,这是不正确的。
2.不可重复读(读已提交)
不可重复读:当事务A多次读取相同的数据时,由于其他事务也在访问该数据、修改、提交,因此当事务A读取相同的数据时,可能会造成数据不一致,称为不可能。反复阅读。
3. 幻读(可重复读)
幻读:因为MySQL数据库读取数据时,会将数据放入缓存中。当事务B对数据库进行操作时,比如删除所有数据并提交,事务A也可以访问该数据,这就产生了幻读。
幻读问题的解决方案是序列化,这意味着完全放弃并发。此时,只要李四在读代码,张三就无法进行任何操作。
4. 序列化
串行化:当事务A和事务B同时访问数据时,当事务A修改数据但没有提交数据时,当事务B想要添加或者修改数据时,只能等待事务A之前的提交事务B可以执行。
因此,为了避免上面提到的各种并发问题,我们必须采取一些措施。 mysql数据库系统提供了四种事务隔离级别来隔离并发运行的事务,使它们互不影响。这就是数据库事务的隔离。
五、MySQL的四个隔离级别
MySQL中有4种事务隔离级别,从低到高:未提交读、已提交读、可重复读和可序列化。
1. read uncommissed(读取未提交的数据)
允许事务读取其他事务尚未提交的更改。 (脏读、不可重复读和幻读都会发生)。
2. read commit(读取已提交的数据)
事务只允许读取其他事务已提交的更改。 (脏读是可以避免的,但是不可重复读和幻读的问题还是可能会出现)
3.可重复读取(repeatable read)
确保一个事务可以多次从某个字段读取相同的值,并在事务期间禁止其他事务更新该字段。 (脏读和不可重复读可以避免,但幻读仍然存在)
4.可序列化(序列化)
确保事务可以从表中读取相同的行。在该事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但是性能很低(因为你做不到,效率太低了)
一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多个事务隔离级别。不同的隔离级别对应不同的干扰程度。隔离级别越高,数据一致性越好,但并发性越差。
串行化的事务处理方式是最安全的,但并不能说就一定好。您应该根据实际需要选择合适的隔离级别。比如银行等涉及资金的场景,需要保证准确度,并且放慢速度。没什么;
总结
MySQL事务有四大特性:原子性、一致性、隔离性、持久性。通过正确管理事务,可以帮助我们确保数据的完整性和一致性。希望通过这篇文章,您能够对MySQL事务有更深入的了解,并在以后的工作中能够更好的利用事务来处理数据。
下次见!
用户评论
金橙橙。-
哇,这个标题简直太实用了!我最近在项目中遇到事务处理的问题,正好可以看看这篇文章,希望能轻松上手。
有19位网友表示赞同!
可儿
作为一名开发者,MySQL事务是基本功,这篇文章必须收藏!希望讲解能简单易懂。
有8位网友表示赞同!
小清晰的声音
看了这个标题,感觉这篇文章一定很实用。我正在学习数据库,这个知识点太重要了。
有10位网友表示赞同!
有你,很幸福
必读!这个标题就让人感觉很有分量。MySQL事务处理总是让我头疼,希望这篇文章能解决我的问题。
有10位网友表示赞同!
呆檬
这篇文章对新手来说太有帮助了!我之前一直搞不懂MySQL事务,现在感觉清晰多了。
有11位网友表示赞同!
迁心
开发者必读,这句话太到位了。我正在为我的项目寻找解决事务问题的方法,这篇教程必须看看。
有15位网友表示赞同!
淡淡の清香
轻松学习,这个关键词让我对这篇文章充满了期待。MySQL事务总是让我感到困惑,希望这次能成功掌握。
有20位网友表示赞同!
孤败
这个标题太吸引我了!我一直想提高自己的数据库知识,这篇教程对我来说是必看。
有8位网友表示赞同!
哭花了素颜
作为一名后端开发者,MySQL事务处理是逃不开的话题。这篇文章我一定要仔细阅读。
有10位网友表示赞同!
等量代换
看到这个标题,我就知道这篇文章会很有价值。MySQL事务处理一直是我项目的痛点,希望能在这里找到解决方法。
有14位网友表示赞同!
醉枫染墨
这篇文章看起来很有深度,作为一名数据库管理员,我必须学学如何更高效地使用MySQL事务。
有14位网友表示赞同!
风中摇曳着长发
标题里的“轻松学习”让我有点怀疑,不过既然是必读,我还是会试试看的。MySQL事务处理对我来说是个难题。
有6位网友表示赞同!
巷雨优美回忆
这篇文章必须分享给我的同事,我们团队在MySQL事务上遇到了不少问题,希望能一起提高。
有6位网友表示赞同!
关于道别
每次遇到MySQL事务问题都头疼,希望这篇文章能让我有所收获,至少别再迷茫了。
有20位网友表示赞同!
心安i
作为一个有几年工作经验的开发者,我依然觉得MySQL事务处理是个难题。这篇文章我得好好研究一下。
有17位网友表示赞同!
浮世繁华
这篇文章太及时了,我刚在项目中遇到事务处理的问题,希望这篇文章能给我带来启示。
有18位网友表示赞同!
疯人疯语疯人愿
MySQL事务处理总是让我觉得复杂,这篇文章如果能让我轻松掌握,那真是太好了。
有17位网友表示赞同!
海盟山誓总是赊
标题里的“必读”让我不敢怠慢,作为一名数据库开发者,这篇教程对我来说是必修课。
有19位网友表示赞同!
↘▂_倥絔
这篇文章看起来很专业,希望作者能详细讲解,让我这个数据库小白也能轻松学会MySQL事务处理。
有6位网友表示赞同!