【MySQL】 -- 事务

如果对表中的数据进行CRUD操作时,不加控制,会带来一些问题。
比如下面这种场景:

image.png
有一个tickets表,这个数据库被两个客户端机器A和B用时连接对此表进行操作。客户端A检查tickets表中还有一张票的时候,将票出售了,而火车票的总数是一个固定值,客户端A此时还没有来得及更新数据库
这时客户端B检查了票数,发现还有一张,又卖了一次票。这种情况,就出现了同一张票被卖了两次的场景。

这就是在进行CRUD时,不加控制带来的问题。
只要当进进行CRUD时满足以下属性,才能解决上面的问题:

  1. 买票的过程得是原子的
  2. 买票互相应该不能影响
  3. 买完票应该要永久有效
  4. 买前,和买后都要是确定的状态

而MySQL的事务机制,就能够有效的解决此问题。

1. MySQL事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。

MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你毕业了,学校的教务系统后台MySQL中,不再需要你的数据,要删除你的所有信息, 那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。

一个 MySQL数据库,可不止一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向MySQL服务器发起事务处理请求。而每条事务至少一条 SQL ,最多很多SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条SQL构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

所以一个完整的事务,不仅仅是简单的DML组合而成,还要满足以下4个特点:

  • 原子性(Atomicity) :事务中的所有操作要么全部完成,要么全部不完成。
  • 一致性(Consistency) :事务执行前后,数据库的状态必须保持一致。
  • 隔离性(Isolation) :一个事务的执行不能被其他事务干扰。
  • 持久性(Durability) :一旦事务提交,其对数据库的修改应该永久保存。

以上 四个属性可以简称为ACID

所以事务就是一条或者多条SQL语句组成并包含ACID

有了事务这种机制后,能够简化我们的编程模型, 不需要我们去考虑各种各样的潜在错误和并发问题.可以想一下当我们使用事务时,要么提交,要么回滚,我 们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服 务的.而不是伴随着数据库系统天生就有的。

1.1 MySQL事务支持的版本

MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM不支持。
使用show engines可以查看。

image.png

1.2 事务的提交方式

事务的提交方式常见的有两种

  • 自动提交
  • 手动提交

使用show variables like 'autocommit';可以查看事务提交的方式。

image.png
ON表示为自动提交。

可以通过set autocommit来更改自动提交模式。值为0,表示禁止自动提交。

image.png
值为1,表示开启自动提交。

image.png

1.3 事务常见的操作方式

为了方便演示,这里创建一张测试表account。

create table if not exists account( 
id int 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++下等马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值