数据库事务四大特性及事务隔离级别在mysql中的具体体现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/StriverLi/article/details/79385421

事务的四大特性

  • 原子性
    指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性
    指事务必须使数据库从一个一致性状态转换到另一个一致性状态。拿转账来说,不管如何转账,钱的总数不变。
  • 隔离性
    指多个用户访问数据库时,用户为每个数据库开启的事务,不能被其他事务的操作数据干扰,多个并发事务之间要相互隔离。
  • 永久性
    指一个数据一旦提交,它对数据库中数据的改变是永久的。

事务的隔离级别

  • 脏读
    指一个事务读取了另一个数据未提交的数据
  • 不可重复读
    指一个事务读取表中同一行的数据,每次读取到的数据不同。主要是有update语句引起的,读取到了另一个事务提交后的数据。
  • 虚读
    指一个事务读取到了另一个事务插入的数据,主要有insert语句引起。

这三种隔离级别依次提高,但隔离级别并不是越高越好,因为安全性越高,效率也就越低。

mysql中的隔离级别

  • read uncommitted(脏读、不可重复读、虚读都有可能发生)
  • read committed(避免脏读,不可重复读、虚读有可能发生)
  • repeatable read(避免脏读、不可重复读,虚读有可能发生)
  • serializable(避免脏读、不可重复读、虚读)

    查看mysql的隔离级别:

select @@tx_isolation;

这里写图片描述

设置mysql的隔离级别:

set transaction isolation level 四个隔离级别

mysql中四种隔离级别的体现:
出现脏读:
这里写图片描述
左边的事务设置了隔离级别为脏读、不可重复读、虚读都有可能发生,当右边的事务执行update语句但没有提交时,在左边可以看到数据的改变,当右边的事务rollback时,左边的事务又发生变化:
这里写图片描述
这就是发生了脏读,一个事务读到了另一个事务没有提交的数据,如果右边的事务rollback,左边的数据读取到的数据就是无效的数据,所以称为发生了脏读。

当设置隔离级别为read committed即可避免脏读:
这里写图片描述
当右边的事务没有提交时,左边的事务无法读到改变的数据,只有当右边的事务提交后,左边的事务才能看到数据的变化:
这里写图片描述
这种情况也叫发生了不可重复读,因为左边事务读取到的数据发生了变化,刚开始a的money是1000,后面又成了1100。

当设置事务隔离级别为repeatable read时,可以避免不可重复读:
这里写图片描述
可以看到,即使右边的事务提交了,左边的事务依旧看不到数据变化,只有当左边的事务也提交,在查询是才能看到数据变化,这样就避免了不可重复读。但此时虚读仍有可能发生。

猜你喜欢

转载自blog.csdn.net/StriverLi/article/details/79385421