数据库操作中,会产生不同类型的错误数据,从而有了事务隔离级别的产生。
-
事务要素(ACID)
原子性(Atomicity):即不可分割性,从操作开始到结束这个过程中,保证全部操作成功或者操作失败并且要回滚到起始状态。 一致性(Consistency):即前后一致,保证数据完整性不被破坏。如A向B转账,不能出现A扣除了钱,但B未收到钱。 隔离性(Isolation):某一个数据,在同一个时间只能有一个事务进行操作。 持久性(Durability):完成后,事务对数据库的所有更新操作保证已存储到数据库。
-
多事务并发会引起的问题
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据 不可重复读:事务A分两次读取数据,在第二次读取之前,事务B对该数据进行了更新操作并提交, 事务A第二次读取到的数据与第一次不一致 幻读:事务A统计数据条数,在这之后事务B新增OR删除了一条数据,此时事务A发现数据条数与之前不一样。 *不可重复读与幻读的区别在于操作,前者侧重修改,后者侧重新增和删除*
-
事务隔离级别
为了避免上述问题的产生,提出了事务隔离级别。(Mysql通过"select @@tx_isolation"查询)
read-uncommited(读未提交):即能够读取到没有被提交的数据,无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用 read-commited(读已提交):即能够读到那些已经提交的数据,能够防止脏读,但是无法限制不可重复读和幻读 repeatable-read(重复读):即在数据读出来之后加锁,类似:select * from XXX for update, 明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它,这个事务不结束, 别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决 serializable(串行化):最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 |
---|---|---|---|
read-uncommited(读未提交) | √ | √ | √ |
read-commited(读已提交) | × | √ | √ |
repeatable-read(重复读) | × | × | √ |
serializable(串行化) | × | × | × |