MySQL事务管理

在刚认识mysql是什么的时候,我曾说过,mysql实际上就是一种网络服务。

而既然是网络服务,那么势必在同一时间内,会有多个请求需要处理,而对这些请求的处理我们必须要加以控制。

比如售票系统,当多个用户去购票的时候,要对余票数量进行正确的update,否则势必会导致一张票被多个用户购买的情况。

为了保证不出现类似的错误,mysql提供了事务的概念。

什么是事务

事务一般都是从用户的角度来看而非程序员的角度来看。

概念:事务就是由一条或多条DML语句组成的集合,这些语句要么全部成功,要么全部失败,在逻辑上具有相关性。

比如一个人想注销自己的某一个账户,那么当用户进行注销动作时,服务器就需要将数据库中的账户以及其相关联的数据全部清除,而注销这个操作就是一个事务。 

而一个数据库中肯定同时会存在多个事务运行,同一时刻有大量的请求被包装成一个事务,然后到服务器执行。如果一个事务只是单纯的多条语句的集合那么势必会出现问题。

因此一个事务还具有以下属性。

  • 原子性(Atomicity): 一个事务要么完成,要么不完成,不存在中间状态,如果事务在执行过程中失败,需要进行回滚,将数据恢复成这个事务没有执行的状态
  • 一致性(Consistency):在事务开始前和事务结束后,数据库的完整性不会被破坏。这表示写入的资料符合所有预设规则,包含资料的精确度,串联性以及后续数据库可以自发完成预定的工作
  • 隔离性(Isolation): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性防止多个事务并发执行时由于交叉执行导致的数据不一致。事务隔离分为读未提交(read uncommitted),读提交(read committed),可重复读(repeatable read),串行化(serializable)
  • 持久性(Durability):事务处理结束后,对数据的修改是永久的,系统故障也不会丢失

这四个属性又被称为 ACID 属性。

而mysql中实际上对一致性并没有技术上的支持,当保证了其他三个属性之后,一致性也就自然保证了。

因此事务实际上就是具有 ACID 属性的DML语句的集合。 

为什么有事务

实际上事务本质上是为了当应用层访问数据库时,能够简化编程模型。程序员们不用去考虑各种错误和并发问题,因此事务实际上是为了应用层服务的,而非数据库天生就有的

我们在此处约定,后续数据库表中的数据都称为一条记录。

事务的版本支持

在mysql中,只有innodb存储引擎支持事务,我们可以查看一下

通过 show engines \G; 来查看引擎。

事务的提交方式

一般事务有自动提交和手动提交方式,我们可以自己设置模式,默认都是自动提交。

不过我们这里为了能够实验事务的属性,设置成手动提交。

一般 1 表示自动提交,0 表示手动提交。

一些事前准备

为了能够更好的演示事务的作用,我们需要将事务的隔离性改成最低级别,即读未提交。

命令: set global transaction isolation level READ UNCOMMITTED;  

然后重新连接mysql即可。

然后创建一个用于测试的表。

事务的演示

以下演示都是在 读未提交 的隔离级别下进行。

正常情况下的演示

使用的命令

  • start transaction / begin :启动一个事务
  • savepoint 保存点名:  可以设置一个保存点,用来进行定向回滚
  • rollback to 保存点名: 可以将表定向回滚到保存点的状态
  • rollback :直接使用可以直接回滚到事务开始之前的状态,即事务失败了
  • commit:表示一个事务成功了,将数据上传到表中去

首先通过 start transaction; 来启动一个事务(或者采用 begin 来启动一个事务)。

并且在插入一个数据之前,都创建一个保存点。

savepoint 保存点名;

 插入完数据之后,通过另一个sql客户端能够查询到数据被正常插入。

然后在插入数据的那一方,通过 rollback to 保存点; 命令来进行回滚操作。

 这时发现,s3保存点之后保存的数据就查询不到了。

 而如果我们一直回滚到 s1 的话,那么 s1 之后插入的数据都不会存在了,不过,我们也可以直接输入 rollback; 来回滚到事务开始之前的状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值