什么是事务——逻辑上的一种操作,要么都执行,要么都不执行。

事务的四大特性(ACID)

  • 原子性:事务是不可分割的最小单位,不允许分隔。事务的原子性要求动作全都完成,要么全都不完成。
  • 一致性:在事务执行前后,数据保持一致,多个事务对同一个数据的读取结果是相同的
  • 持久性:一旦事务被提交之后,他对数据库的改变是永久的,即使数据库发生故障也不应该对其有任何影响。
  • 隔离性:在并发的访问数据库时,一个事务不应该被其他事务干扰。

一个典型的事务例子 ——转账问题
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

并发事务带来哪些问题?

就一般而言单线程事务基本不会出现问题,但是在日常使用中,经常会发生多个事务并发运行(多个用户对一条数据进行访问修改),就会造成以下几个问题

  • 脏读:事务A访问一条数局并对其进行修改(修改的数据还未保存到数据库中),在此期间事务B也访问并使用了该数据。但是B使用的数据是A提交之前的数据。这就造成了脏读。
  • 丢失修改:事务A访问一条数局并对其进行修改(修改的数据还未保存到数据库中),在此期间事务B也访问并修改了该数据。假设该数据m=10;A执行的操作为m+1;B执行的操作为m+2;在正常情况下应该执行了两次+操作,但是由于事务B并不知道事务A对其也进行了操作,结果就导致修改过后的数据为m=12;
  • 不可重复读:事务A对一条数据进行多次读操作,在此期间事务B对该数据进行了修改。这就会导致事务A前后读取到的数据不一致。
  • 幻读:幻读与不可重复读类似。它发生在事务A读取了几行数据,接着另一个并发事务B插入了一些数据时。在随后的查询中,第一个事务A就会发现多了一些原本不存在的记录,就好像发生了幻觉一样。

不可重复读和幻读区别:不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。

为了解决并发事务带来的问题MySQL提供了四个隔离级别来防止上述的问题出现

MySQL隔离级别

  • 读取未提交:最低的隔离级别,允许读取 读取尚未提交的数据。
  • 读取已提交:允许读取 读取已提交的数据。
  • 可重读读 :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改
  • 可串行化:最高的隔离级别完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰

MySQL中事务的状态存储在什么位置 mysql事务问题_数据库