一.什么是事务
事务是指逻辑上的一组操作,组成这组操作的一系列操作要么全部成功,要么一个都不做。因此,事务的结束有两种,当事务中的所有操作全部成功执行时,事务提交。如果其中一个操作失败,将发生回滚操作,撤消到事务开始时的状态。
二.事务的四大特性( ACID)
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持久性( Durability )。这四个特性简称为 ACID 特性。
- 原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 。
- 一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。比如,当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统在运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
- 隔离性
一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性
指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
三.事务并发问题
脏读:事务A读取了事务B更新、未提交的数据,然后B回滚操作,那么A读取到的数据是脏数据(没有用的数据)
不可重复读:事务 A 多次读取同一数据,结果读取的数据不一致,也就是说不支持重复读,重复读会有错误。 原因是 事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据不一致。
幻读:事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。 需要表锁才能隔离,所以大都数数据库都 没有将幻读隔离。
注意:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
四、解决并发问题
为了解决以上3个并发问题,要用到事务隔离,有以下四种隔离级别
Serializable (串行化) | 可避免脏读、不可重复读、幻读的发生。但是效率最低 |
Repeatable read (可重复读) | 可避免脏读、不可重复读的发生。(最常用的mysql默认的级别就是4) |
Read committed (读已提交) | 可避免脏读的发生。 |
Read uncommitted (读未提交) | 最低级别,任何情况都无法保证,但效率最高,最不安全。 |