什么是事务?如果你还只会说ACID,面试已经失败一半了!

目录

1. 事务的基本概念

2. 事务的处理原则

3. 事务的ACID特性

3.1 原子性(Atomicity)

3.2 一致性(Consistency) 

3.3 隔离性(Isolation)

3.4 持久性(Durability)

4. 事务的状态

5. 隐式事务

6. 显式事务

7. MySQL的哪些引擎支持事务?


1. 事务的基本概念

事务:是一组具有操作逻辑的单元,它可以使一组数据由一种状态转变为另一种状态。

我来解释一下这句话什么意思。一组具有操作逻辑的单元:我们知道,关于数据库,我们最常做的就是增删改查操作,那么一条 增/删/改/查 语句就可以看成是一个操作单元,那么我们这里所理解的一组这个数量单位是至少大于等于二。也有很少一些事务是由一个SQL语句形成的,很少遇到,但各位同学也要知道这一点。

一组数据由一种状态转变为另一种状态:就以两个银行账户为例,A账户给B账户赚钱,那么A转了多少,A账户就应该扣除多少,B账户就应该增加多少,不应该说A扣了但B没加上,或者A账户未扣钱但B账户却加钱了,这种情况不应该存在也不能存在。对于A账户和B账户整体来说,我们想要的结果是不管A对B转账,还是B对A转账,经过转账后两个账户都应该是符合逻辑的一组数据,转账后两个账户的余额总和应该与转账前相同,我们不关心中间发生了什么。

将上面两段话总结概括,我们就会对事务有一个简单的了解了。事务就是至少两条 SQL 语句构成的一组执行单元,在执行完这一组语句之后,得到的最终结果其状态应该是符合逻辑的,并且是合法的,只不过是从原来的一种状态变成了另一种状态。

2. 事务的处理原则

我们再提到上面转账的那个例子,A账户给B账户赚钱,不能存在A账户扣钱了B账户没加钱或A账户未扣钱但B账户加钱这种状态。为了避免这种情况的发生,事务就有一个处理原则,即使出现了故障,也不会改变这种原则。当一个事务执行多个操作时,要么将所有的操作全部提交(commit),将数据全部永久保存下来;要么数据库就放弃做的所有修改,就算有些操作已经完成了,也必须将整个事务回滚(rollback)到最初的状态。

3. 事务的ACID特性

3.1 原子性(Atomicity)

我们通常说原子是宇宙最小的单位,这句话也正是想体现出这一点。也就是说,我们的事务虽然是由一组SQL语句构成的,但在我们看来它就是一个最小的执行单元,不能将它们分割。这一组事务执行完成之后,要么全部成功提交,要么全部回滚到最初状态,不能说我这个事务有几十条SQL语句,执行到最后一步有失败发生,然后将前面做的全部提交,失败的回滚,这样绝对不行。只要这个事务中的所有语句没有全部执行成功并且提交,即使前面的SQL语句已经完成,也必须回滚,不能将这些语句分割,这就是原子性。

3.2 一致性(Consistency) 

一致性主要是说,我们事务中的SQL语句再执行完毕后,其得到的结果应该是从一个合法状态转变成了另一种合法状态,这里说的合法是我们生活层面上理解的是否合法,而不是说我们的SQL语句是否合法。举个栗子,A账户对B账户转账,A扣100,首先要判断A是否足够100,如果不够扣,那么这条语句执行后就是不合法的;再者,如果A成功扣除100,但是B未加上100,这也是不合法的,因为前后一致性不一致,我们希望得到的逻辑结果是B加上100,A和B两账户总金额之和不变,这就是一致性。

3.3 隔离性(Isolation)

隔离性是指一个事务在执行时不能被其他事务影响,我们可以从多线程的角度来来理解。

如上图,是A账户对B账户转两次账,两次都是转50,我们把这两次操作可以分为两个线程去执行。

理想情况下,我们希望是事务1与事务2都按照下方的顺序挨个去执行

第一步:把A账户的余额读到磁盘去;

第二步:执行A账户扣钱操作;

第三步:将A的150写入磁盘;

第五步:将B的余额读到磁盘;

第六步:执行B账户加钱操作

第七步:将B的50写入磁盘;

但实际上,如果我们没有给事务添加隔离性,就等于是上述这七步操作,每一步都有可能有别人中途打断,就像上面图中的情况,最后一步B要写入磁盘了,还没来得及写呢,事务2进入先执行完了,执行完成之后恰好值为50,然后又执行事务1中的写入50操作,这样执行下来,A账户剩余100,但B账户只有五十,它们虽然都成功完成了,满足原子性,但是不满足我们刚才说的一致性,A与B之后由之前的200变成了150。

3.4 持久性(Durability)

持久性在事务上的意思就是,我们执行的操作一旦完成,就会持久性地保存在数据库中,对数据库中数据发生的变化是永久性保存的。

举个例子,张三向李四转了100块,转账完成之后后悔了,但现在事务已经完成了,所以张三不可能从事务的层面上让刚才发生的转账回滚,因为转账事务已经完成了,数据的操作也已经永久化的保存到了数据库中,如果张三想把钱要回来,不能回滚刚才的事务,只能让李四再转回来,这个时候注意,李四再转回来,它就是另外一个事务了,和刚才的事务不矛盾不冲突。

4. 事务的状态

如上图,就是一个事务在执行过程中可能发生的状态。

活动的(active):表示该事务正在正常进行;

部分提交的(partially committed):表示事务中部分逻辑语句已经执行完成,这里的提交指的是内存层面的提交,还没有写到磁盘上去;

提交的(committed):表示事务顺利完成,数据也成功提交写入磁盘;

失败的(failed):当处于正常活动时,如果发生错误(数据库自身错误,服务器宕机,断电等)或者人为性的手动停止,就会进入失败状态;部分提交状态也可以进入失败状态,因为一部分语句成功完成,不代表事务中剩余的语句会顺利完成,如果失败,数据就要全部进行回滚;

中止的(aborted):如果事务进入失败状态,在回滚之后,就会进入到中止状态,事务将不再继续进行。

5. 隐式事务

在我们常用的 MySQL 数据库中,隐式事务是默认开启的,而且每条单独的 SQL 语句都是一个单独的事务。如下图 student 学生表,

我简单添加了几个数据,然后我对该表 studentno = 2 的学生姓名做修改,这条修改语句就是一个隐式事务,执行完毕后会自动将结果提交。如下所示

语句执行成功,我们回到学生表刷新查看

修改成功,我们也可以看到,在 update 语句中,我们没有任何关于事务的关键字,它只要执行,就会直接将结果进行自动提交,将受影响后的结果呈现出来。

在实际业务开发的过程中,我们的一个业务需求通常会执行多条 SQL 语句,一旦程序出现错误,就需要全部回滚。如果我们使用隐式事务根本达不到这样的效果,因为隐式事务默认开启,并且每条语句都是一个事务,这样我们即使执行事务中得一条SQL语句也会马上提交,而事务具有持久性,一旦提交就无法回滚了,因此在实际业务开发时,我们通常会使用显式事务。

6. 显式事务

刚才简单说了一下隐式事务,下面我们说一下显式事务。

在 MySQL 数据库中,显式事务可以使用关键字 START TRANSACTION 或 BEGIN 开启,后面还可以跟 read only(只读),read write(读写),with consistent anapshot(一致性读)。

read only 表示事务只能进行查询操作,不能进行增删改操作;

read write 表示事务既能进行查询操作,也能进行增删改操作;

with consistent anapshot 可以和 只读与读写 两种操作搭配使用;

还有一些情况下,可能我们的事务需要进行很多操作,但有一步操作做错了,我们就需要回滚到最初状态,但我们觉得回滚到最初状态太麻烦,就可以在中间某个地方设置一个保存点 savepoint,我们回滚就会回滚到保存点,然后我们可以考虑继续回滚到最初状态或者是重新执行业务。

如下代码所示

START TRANSACTION READ_WRITE # READ_WRITE 即可读又可写
UPDATE student 
SET student.`name` = "张女士"
WHERE student.studentno = 2
SAVEPOINT #定义一个回滚点,当我们想回滚时就可以回滚至此处
UPDATE student 
SET student.`name` = "张先生"
WHERE student.studentno = 2
COMMIT; # COMMIT 手动提交事务

7. MySQL的哪些引擎支持事务?

想要查询 MySQL 的那些引擎支持事务,我们只需要在 MySQL 执行"SHOW ENGINES"命令,如下图所示

从上图我们可以看到,只有 MySQL 默认的 InnoDB 存储引擎是支持事务的,Transactions 即事务,XA 指分布式事务,如果一个引擎支持分布式事务,那么它也一定支持事务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值