事务的特性(ACID)

  • 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作但愿,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作

  • 一致性(Consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。

  • 隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。

  • 持久性(Durability):一旦事务提交,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务并发存在的问题

  • 脏读:事务读取了未提交的数据。如:事务A读取了事务B更新的数据,然后事务B回滚了,那么A读取到的数据是脏数据。

  • 不可重复读:在同一个事务中两次执行同样的查询,得到的结果不一致。如:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  • 幻读:当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。InnoDB可以通过多版本并发控制(MVCC)解决幻读的问题。

事务隔离级别

  • READ UNCOMMITTED(未提交读):一个事务中的修改操作即使没有提交,对其他事务也都是可见的。会出现脏读的问题

  • READ COMMITTED(提交读):一个事务开始时,只能“看见”已经提交的事务所做的修改。解决了脏读的问题,但是会存在不可重复读的问题

  • REPEATABLE READ(可重复读):一个事务在多次读取同样记录时,结果是一致的。解决了脏读不可重复读的问题,但是无法解决幻读的问题

  • SERIALIZABLE(可串行化):在读取的每一行数据上都加锁,通过强制事务串行执行的方式,避免了脏读不可重复读幻读的问题,但是性能差

隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
读未提交(read-uncommitted) Yes Yes Yes No
不可重复读(read-committed) No Yes Yes No
可重复读(repeatable-read) No No Yes No
可串行化(serializable) No No No Yes

总结

  • 事务的隔离级别从高到低的排序为:可串行化 > 可重复读 > 不可重复读 > 读未提交
  • 不可重复读针对的是记录的修改操作,幻读针对的是记录的插入操作
  • MySQL默认的事务隔离级别是REPEATABLE-READ,可以通过show variables like 'transaction_isolation';命令查看
MySQL中的事务隔离级别
文章转载:http://www.shaoqun.com/a/463818.html