事务(初阶)

本文详细解释了数据库事务的概念,强调了原子性、一致性、持久性和隔离性的核心含义,以及这些特性在处理并发操作中的重要性,如MySQL中的脏读、不可重复读和幻读问题及其解决方案。
摘要由CSDN通过智能技术生成

基本概念

概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务 。对应在数据库中,就是数据库事务。
举个简单的例子:假如,你此时正在进行转账的操作,首先你要将100块钱转到张三的账户上(update user set money= money+100 where name = ‘张三’),然后再从李四的账户上扣掉100块,但是不巧的是此时突然断网了,接下来的扣钱操作进行不了了,这样就造成张三的账户里多出了100块,但是李四账户里没有扣款。这不就平白无故多出来100快吗?此时最亏的就是银行了,但是银行怎么可能去吃这个亏呢?所以上诉的写法一定是不能被采用的,这就体现了事务的重要性。
事务:本质上是将一些操作都打包成一个整体,这个整体要么执行成功,要么一个都不执行,这样可以有效避免,部分执行,部分未执行,产生的一些由 “ 中间状态引起的问题”。

四大特性

重难点也就是隔离性
在这里插入图片描述

  • 原子性
    说到原子性,我们就先说一下回滚机制:当数据库在执行某一事务的时候,会主动记录日志,这个日志是写入硬盘了,如果在执行事务的过程中,出现问题了,MySQL 就可以根据日志中记录的内容,来进行回复操作。在这里插入图片描述
    这就是事务的原子性。
  • 一致性:这里的一致性不是数据的前后一成不变,而是前提是我知道我的事务是干啥的,然后我利用事务进行了一系列操作将数据改变了,得到的最终数据虽然变了,但是我们还是认为:它具有一致性。其实这里的一致性也与回滚有关:一旦触发了回滚,回滚后的数据一定是一致的(这样的数据就是前后一样),但如果没有触发回滚(证明事务成功执行了,得到的数据也是符合要求的)。(比如:公司的会计,他要保证公司的收入和支出都是均衡的,如果有那个账对不上,他可能就要吃国家饭了,这也体现了一致性。如果公司的一笔钱支出,买了某设备被记录了,此时的公司虽然没有收入,但我们认为,它也具有一致性,这与我上面讲的“ 数据不是一成不变 ”很对应)。
  • 持久性:持久性就是说我们的数据是储存在硬盘上,且不会随着(断网, 断电,系统崩溃,程序崩溃)等……各种因素而变化,当程序重启或者主机重启的时候数据都存在。它内存是有本质区别的,当数据储存在内存上的时候,会随着程序的结束而消失,这样就体现不了持久性了。
  • 隔离性:出现多个事务时,按照实际事务的需求来选择是要求准确性高一点,还是效率高一点。(读到最后你就明白了)
    这个特性需要借助实例来理解,我们都知道MySQL是一个客户端~服务器型的数据库,每个时间点都有可能有很多客户端提交事务,但是,具体到底是什么时间点提交,我们不得而知。这就出现了一个问题,当多个用户在同一时间点同时申请访问服务器数据的时候,我们的数据库服务器是到底先执行哪个事务呢?可能MySQL源码有这样的考虑。但是,假如我们再将条件改的特殊一点,假如客户们在同一时间,访问了同一个服务器的一张表呢?(就像在百度上搜商品一样)那么那些事务所执行的顺序是啥呢?一个一个执行吗?这样效率会很慢,那要是一起执行呢?这样就可能导致出现几个问题:
    1,脏读: 事务B读到了事务A中未提交的临时数据
    举个例子吧:假如你此时是一位老师,你正在办公室用电脑备课写课件,此时小明走过你的窗前,并且偷偷瞄了一眼你的电脑屏幕。之后,小明就兴高采烈的去班里面吹嘘,但是他不知道的是,当他喵过了那一眼以后,你发现有些地方写的不太恰当,于是就改了一部分,将改过的那份课件作为了上课前的标准课件,此时小明还在课堂上大胆预测你接下来要讲什么,殊不知自己已经成为了小丑了。
    上面的例子里:由于小明在标准课件未发布的时候就看了课件,结果导致自己所读到的信息是错误的叫做脏读;(上面的提交标准课件课看做事务A,小明瞄一眼可以看做事务B)。
    解决方案: 对“ 写操作 ”加锁(就是将窗户关上,防止小明再偷看,直到我写完课件再让他看)。

2,不可重复读: 事务B在读的过程中,事务C对刚才事务A的内容做出了修改,导致事务B在读的过程中前后读的不一致。
举个例子:还是接着上面的例子说,我们将窗户关掉,等到做完课件的时候,再将它发出来,此时小明正在津津有味的读你的课件。但是,此时你又发现了一个小错误,于是你就执行了事务C 将原先提交的A修改了一下,但是此时的事务B正在读,这个事务B内部可能不止有一个select查询语句。所以,他可能会查询很多次,但是当他查到某一次的时候,发现内容竟然和之前的不一样,于是你再次靠实力让小明再一次带上了他的小丑面具,此时小明肯定不乐意了,于是他就来质问你。于是你们就约定多次修改,一次提交,这样能大大提高准确率。
解决方案: 对“ 读操作 ” 加锁,你们约定:在他读的时候,你不能再修改。

3.幻读 : 和不可重复读类似,在事务B 进行读操作的时候 ,事务C并没有修改原始数据,而是修改了结果集合,导致事务B在进行不同的读操作的时候读到的“结果集合”不同。
举个例子:还是按照上面的故事展开,我么已经约定了:上交了就不能再改了。但是,此时你看到课件其实还能变的更完美,但此时又不能再改了。所以,此时,你又想了一个点子,我不能该原来的数据了,那我新建一个不就行了吗,于是通过事务D又新建了一个更先进的数据,此时的小明虽然读的是不变的数据,但是,当他某次查询后,发现又多出来了一个进阶版课件,这是怎么回事?于是你又一次将小明耍了一次。
解决方案:串行化。(就是使所有的事务都严格按照“ 一个一个 ” 的方式执行,完全没有并发了,此时的执行效率是最低的,隔离性也是最高的,数据也是最准确的)

具体的隔离性体现如下:
在这里插入图片描述

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值