Mysql事务

时间:2021-07-17
本文章向大家介绍 Mysql事务,主要包括 Mysql事务使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Mysql事务

mysql事务定义

事务:事务是并发控制的基本单元,事务是一个操作序列,要么都执行,要么都不执行,他是一个不可分割的工作单位,事务是维护数据库一致性的单位。

事务的四大特性:原子性,一致性,隔离性,持久性

  • 原子性,一个事务是一个原子性的操作,那么一个事务要么成,要不就不成
  • 一致性,在操作的前后数据总量不变,并且合法的数据才能被写入
  • 隔离性,隔离性主要是多个用户可以并发访问,相互之间是隔离的
  • 持久性,是代表数据的操作在提交结束以后那么操作的结果是持久的,数据的操作结果要得到固化。

事务的隔离性

多次读取并发中出现的问题

  • 脏读:就是一个事务在读取事务在处理的过程中,还在处理并没有提交,另外一个事务就读取了该事务,那么肯定是是不行的(例如:小明在存款的过程中,继续了另外一个事务查询存款,查询到已经存储成功,但是后面存储人员信息出现问题,倒置没有存储成功,那么查询已经成功了就出现了问题)

  • 不可重复读:是指一个事务执行两次那么两个的数据是不同的,一个事务执行两次查询返回了不同的结果,其中的原因是因为在第一个事务在执行第一次和第二次查询的过程中。另外一个事务对数据进行了修改

  • 幻读:是指一个事务连续两次查询一个范围内的结果,出现的数量不同。(其中一个原因是因为在读取的过程中由于在第一次查询中第二次查询后会多一行数据的情况,并且没有说两次查询是在同一个事务当中)

事务的四个隔离级别

  • 读未提交(Read UnCommitted)
    这里顾名思义,读未提交就是对于一个事务在未提交的过程中就被读到。
    例如:老婆给老公转300元,转错了转成500元,但是还没转就被老公看见很高兴,能多得到钱,但是妻子发现后改成300元这时老公还不知道。
    因此这种的方式会存在脏读,幻读,以及不可重复读的问题。

  • 读提交(Read commit)
    读提交顾名思义,就是只能读取已经提交的数据。是sqlserver以及oracle的方式。
    例如其实去买零食花100元,但是妻子从他的账户要转出两百买菜,原本他发现自己账户里面有200,但是买零食的时候发现钱不够了。零钱变成了0。
    这种方式有效的解决了脏读的问题,但是存在不可重复读,以及幻读的问题。

  • 可重读读(Repeated read)
    这里采用的可重复读的意义是当一个查询开启的时候其他的update的操作不可以进行,是Mysql的常用的方式。
    例如:男子用100元零花钱去买零食,那么着时候他的老婆再想再账户里面拿钱去买菜是不可以的。
    但是会这种情况会出现幻读的情况。
    例如:他老婆查询到他是花了100买零食,但是于此同时他有花了100买了青菜,当她老婆打印消费单的时候会发现雄消费是200元。

  • 序列化(serialized)
    这种方式是将所有的操作当成一个序列来进行处理。但是这种方式效率特慢一般不会采用这种方式。
    例如:老公买零食----》妻子查账-----》老公买水果------》妻子打印账单

解决方式

幻读产生的原因

主要是由于在读的过程中有其他的插入的操作所导致。

  • 在快照读的情况下采用MVCC的模式
  • 在当前读的情况下采用Next-key的方式来进行加锁。

原文地址:https://www.cnblogs.com/xinyu520/p/15024849.html