数据库事务的四大特性以及事务的隔离级别
事务的 ACID 原一隔持
⑴ 原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。
⑵ 一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
⑷ 持久性(Durability)
指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
数据库的四种隔离级别
这四种不同的隔离级别对应着在事务的并发操作中可能会出现不同的不一致性问题:脏读,不可重复读,幻读
-
脏读:指的是在一个事务里读取了另一个事务并未提交的数据。
- 例:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
-
不可重复读:指的是在一个事务里读取了前(另)一个事务一提交的数据。
- 例:一个事务A中发生了两次读操作,第一次读操作和第二次读操作之间,另一个事务B对数据进行了修改,这时两个事务读取的数据不一致。
- 不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……
-
虚读(幻读):第一个事务A对一定范围的数据进行批量修改,第二个事务B在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。
- 例:事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
- 幻读和不可重复读区别:都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
读未提交(Read uncommitted)
最低级别,任何情况都无法保证。
读已提交(Readcommitted)
可避免脏读的发生。
可重复读(Repeatable read)
可避免脏读、不可重复读的发生。
串行化(Serializable )
可避免脏读、不可重复读、幻读的发生。同时效率也是最低的
小记
- 在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
- 在sqlserver数据库中默认的隔离级别为read committed(读已提交)。
- oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。默认系统事务隔离级别是READ COMMITTED(读已提交)
最后总结一下
- 四大隔离级别:串行化、可重复读、读已提交、读未提交;
- 四大特性(ACID):原子性、一致性、隔离性、持久性;
- 三个问题:脏读、不可重复度、幻读;