MySQL数据库中的事务和事务的隔离级别

本次演示事务使用的是MySQL数据库
一、事务的基本要素(ACID)
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
   二、事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读
三 我们来看看MySQL事务的隔离级别MySQL数据库中的事务和事务的隔离级别
我们看看MySQL的默认事务隔离级别
输入命令 select @@tx_isolation
MySQL数据库中的事务和事务的隔离级别
MySQL默认是可重复读,是什么意思呢 上面概念已经提到了 ,下面我们以代码的例子来看看这个可重复读, 下图是我A表里面的初始数据
MySQL数据库中的事务和事务的隔离级别
我们 用cmd命令行来连接数据库 ,首先先用命令语句start transaction 开启一个事务
然后把A表里面的moeny-200;然后在当前窗口查询A表信息看下图。
MySQL数据库中的事务和事务的隔离级别
这个时候 在当前窗口查询的时候 A表里面的money确实减了200 ,我们这时候用
Navicat这个工具新建一个查询窗口在查看下如图:
MySQL数据库中的事务和事务的隔离级别
发现这个时候 查询的money并没有减小,这是怎么回事呢?为什么在当前窗口查询减少了,另外一个却没有减少呢?其实原因很简单,正所谓事务的隔离级别都是对于并发的情况下,你在自己的工作区间进行修改,增加,删除对于自身都是可见的,对于不是自身的时候是不可见的,和java多线的内存可见性是不是很像呢?(哈哈 )
下面我们conmmit 来提交事务 看看两边数据一致不?
MySQL数据库中的事务和事务的隔离级别
MySQL数据库中的事务和事务的隔离级别
这就是默认数据库的隔离级别,可重复读意思是说:

当一个事务更改一条数据并未提交事务时对于自身是可见的,对于另一个事务是不可见的,这就是不可重复读**

下面我们来看看读未提交
我们在看这个读未提交代码实例之前先把MySQL数据设置全局的事务隔离级别

语法:set global transaction isolation level  read  uncommitted

MySQL数据库中的事务和事务的隔离级别
从图中我们看出A表里面的money里面的余额还剩300,我们在当前窗口继续减去200 ,然后在查询根据上面我们分析的 一个事务的更新操作后不管这个事务是否提交对于当前窗口都是可见的,到底是不是这样的呢 我们来看下图
MySQL数据库中的事务和事务的隔离级别
从图中我们看到事务还没有提交,里面的钱已经减去200了 和我们分析的一样,按照我们的分析,这个时候在打开另一个窗口 查询 数据应该不是100 而是300 因为这个事务没有提交,所以对于另外一个事务是不可见的 我们来看代码
MySQL数据库中的事务和事务的隔离级别
这时候我们发现另外一个事务也可以读取未提交的事务了,并不是对另外一个事务不可见的了,原因你们也知道了把因为我们设置了隔离级别读未提交,所以对于其他事务也是可见 的,(相当于java里面的多个线程修改值对于另外线程也是可见的 读未提交相当于java里面的volatile关键字) 这就是脏读

事务A修改数据时对于其他事务B是可见的这就是脏读

看完了 脏读和不可重复读 下面我们来看看幻读
演示幻读之前我们往A表中在添加几条条数据如图;
查看表中数据money总和是多少
MySQL数据库中的事务和事务的隔离级别
这个时候事务B先查询money总和
MySQL数据库中的事务和事务的隔离级别
这个时候往表A中增加一条数据并提交事务

MySQL数据库中的事务和事务的隔离级别
这时候事务B 开始查询 发现多了400 这就是 幻读
MySQL数据库中的事务和事务的隔离级别
关于数据库的事务先总结到这