理解MySQL数据库事务

服务器

浏览数:104

2019-6-19

AD:资源代下载服务

1. 什么是事务处理?

事务处理是一种机制,它是用来管理必须成批执行的mysql操作。来保证数据库不完整的操作结果。

2. 为什么要使用事务处理?

在使用mysql操作数据的过程中,如果只是简单的中小型程序而言,我们不需要考虑mysql的事务。但是在比较复杂的情况下,用户执行某些数据操作过程中,需要通过一组sql语句执行多项并行任务的时候。就必须保证操作数据的同步性。并且在执行中,产生依赖关系的动作能够同时操作成功或同时返回初始状态。那么在这种情况下,就需要考虑使用mysql事务处理了。

在mysql中,事务是由单独的一个或多个sql语句组成的。每个sql语句都是互相依赖的。如果某条sql语句执行失败或发生异常的情况下,那么整个操作都会回滚。所有的数据操作都会返回原始的初始状态。如果单元中的所有的sql执行成功,那么事务就被顺利执行。

那么打个比方,比如银行转账为列:

用户A需要给用户B转账1000元,那么用户A使用手机直接把1000元打到用户B的银行卡中了,指令已经发出去了,但是由于用户A把用户B的银行卡号输入错了,那么这种情况下,用户B的银行卡是不会多出1000元了,但是用户A银行卡少了1000元,那这样的话肯定是不合理的,因此我们需要将用户A向用户B转账这么一件事情当做一个事务来处理。如果用户B的真实姓名和银行卡号对不上的话,那么整个转账事务就会失败,那么因此需要使用回滚操作,回滚到转账前的初始状态。因此用户A也不会少1000元,用户B也不会增加1000元。那么这种情况下才是最合理的。

事务处理中的一些术语的解释:

事务(transaction) 指一组sql语句。
回退(rollback) 指撤销指定sql语句的过程。
提交(commit) 指将未存储的sql语句结果写入到数据库中。
保留点(savepoint) 指事务处理中设置的临时占位符,我们可以对他们发布回退操作。

3. mysql存储引擎

mysql的存储引擎是可以改变的,默认是 InnoDB 存储引擎,mysql中有8种存储引擎。

1. MyISAM: 他是高速引擎,但是不支持事务处理。
2. InnoDB: 支持行锁定以及事务处理,速度比MyISAM稍慢
3. ISAM: MyISAM的前身
4. MERGE: 将多个MyISAM类型的表作为一个表来处理的引擎
5. MEMORY,HEAP: 只在内存上保存数据
6. Falcon: 一种新的存储引擎,支持事务处理
7. ARCHIVE: 将数据压缩后保存(只能支持INSERT/SELECT操作
8. CSV: 以CSV形式保存数据(应用于跨平台数据交换)

如上只是了解下有哪些存储引擎,其实我们mysql的常见使用的存储引擎就是 InnoDB,其他的我们可以简单的了解下就
可以了。

数据库事务相关命令如下:

1. 查看存储引擎:SHOW CREATE TABLE 表名;
2. 更改引擎: ALTER TABLE 表名 ENGINE=新引擎名;
3. 回滚: ROLLBACK;
4. 声明事务开始: BEIGIN;
5. 事务提交: COMMIT;
6. 查询自动提交功能状态: SELECT @@AUTOCOMMIT;
7. 设置自动提交功能: SET AUTOCOMMIT=0或1;
8. 设置分离水平: SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

1. 查看存储引擎,使用命令:SHOW CREATE TABLE 表名; 如下图所示:

2. 更改存储引擎,使用命令:ALTER TABLE 表名 ENGINE=新引擎名; 如下图所示:

4. 事务处理

事务有如下四大特性:

1. 原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚。

2. 一致性:指事务必须使数据库从一个一致性状态变换到另一个一致性状态。(比如拿转账来讲,假设用户A和用户B两者的钱加起来一共是2000,那么不管是用户A还是用户B之间如何转账,转几次账,事务结束后两个用户的钱加起来应该还是2000,所以这就是事务的一致性)。

3. 隔离性:指当多个用户并发访问数据库并且操作同一张表的时候,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

4. 持久性:指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,哪怕是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

如上就是事务四大特性。我们可以简单的理解下就可以了。

4.1 回滚演示(ROLLBACK)

如下图所示:

如上演示我们可以看到,当我们删除表格里面的数据的时候,我们再执行回滚操作(ROLLBACK), 删除的记录又恢复到begin之前的状态,如果我们将 ROLLBACK 换成 COMMIT 的话,那么事务将会被提交了,删除的事务就不能再恢复了。
如下继续演示下:

4.2 自动提交

当我们的mysql的数据库的引擎为 InnoDB的时候,我们可以设置自动提交功能是否开启,当自动提交功能为on的时候,命令执行就会提交(commit). 当我们自动提交设置为off的时候,必须执行commit才会提交事务。但是我们可以使用rollback进行回滚操作。

首先我们来查询下当前自动提交功能的状态;如下基本语法:

select @@autocommit;

如下所示:

我们需要设置自动提交功能的基本语法如下:

set autocommit = 0 或 1;

注意:0 代表是off,1代表的是on.

4.2.1 自动提交设置为off

如果我们将自动提交设置为off的时候,我们插入一条记录,然后我们使用回滚 rollback的操作,我们再次查看记录,会发现我们返回到了初始状态。如下图所示:

但是当我们将自动提交设置为on的时候,我们插入一条数据后,然后我们使用回滚 rollback的时候,我们再次查看记录,会发现在我们插入数据的时候,会自动触发commit状态(自动提交). 因此回滚的时候是回滚不了初始咋提的。
如下图所示:

4.3 部分回滚 savepoint

如果我们设置 autocommit = 0 的时候,不自动提交,然后我们使用 rollback会回滚到我们的初始状态的时候,而我们现在通过 savepoint 就可以保存一个点,通过 rollback to savepoint 就可以回滚到保存的点了。

部分回滚主要有两个步骤:

1. 保存点:执行命令:savepoint 保存点名;

2. 回滚到保存点:执行命令:rollback to savepoint 保存点名;

比如如下所示:

4.4 锁定与事务处理

如上我们使用rollback操作是指一个用户下进行的。但是如果是多个用户下同时操作呢?比如说12306购票系统,无数的人同时使用,因此我们的事务必须能够处理多个用户同时操作的情况。因此我们需要锁定。

比如说:我们过年的时候会在12306网站上同一刻时间点买票,比如说用户A和用户B同时登陆购票网站,并且买的是同一张票,比如说看到的都是剩余1张票了,因此用户A和用户B赶紧下单,那么这个下单的时间点肯定是有先后顺序对吧,那么假如用户A下单的时间更早,因此该票会被锁定,因此用户B就不能买了。这种情况就是事务的锁定。

4.4.1 锁定分为 共享锁定 和 排他锁定。

什么是共享锁定呢?共享锁定是将对象数据变为只读形式,不能进行修改的。
什么是排他锁定呢?排他锁定就是当我们执行 insert/update/delete的时候,其他的事务不能读取该数据。因此我们也可以叫做写入锁定。

4.4.2 事务处理的分离水平

事务处理的分离水平一般是 READ UNCOMMITED; 它可以是非提交读取,也可以不可重复读取,还可以是幻像读取。

设置分离水平可以使用如下命令:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

1. 理解非提交读取

什么是非提交读取呢?指的是别的事务能够读取到还没有提交的更新数据。什么意思呢?比如说我使用sql语句更新了一些数据,但是并没有使用commit提交,但是其他的用户可以查询到我刚刚更新的数据。为了演示下,我们可以打开2个命令行窗口,演示如下:

2. 理解不可重复读取

不可重复读取是指在某事务处理过程中对数据进行读取,由于该事务更新操作导致多次读取数据时发生了改变。这个demo先省略了。。。

3. 理解幻象读取

幻象读取指的是,在某事物处理数据过程中对数据多次读取,由于该事务的插入/删除操作而导致在多次读取过程中读取到不存在或者消失的数据。这个demo先省略了。。。

作者:龙恩0707