数据库事务总结
1.数据库事务
什么是事务?事务指的是一系列不可分割的执行单元。
2.事务的4大特性ACID
原子性(Atomicity),一致性(consistency),隔离性(Isolation),持久性(Durability)
A(Atomicity)原子性:
事务是一个不可分割的执行原子单元。所有的操作只有都执行成功,整个事务才会提交。事务中的任何一个操作失败,已经执行到的任何操作都必须撤销,让数据库回到初始的状态。
C(Consistency)一致性:
事务从一个一致性的状态变换到另外一个一致性的状态。一致性指的是对数据的约束性。以A和B转帐为例子,A和B都要100元,这时A给B转100元,A = 0,B =200 ,此时A和B的总额仍然为200.
不管操作如何,A和B的存款总额不变。
I(Isolation)隔离性:
一个事务的执行不会被其他事务干扰。
D(Durability) 持久性:
事务一旦被提交,对数据库的改变是永久性的。
3.并发一致性问题
多个事务共同访问同一个资源。
事务并发可能会导致的问题:
(1)第一类丢失更新:撤销一个事务时把其他事务已经提交的数据回滚掉;
(2)第二类丢失更新:提交一个事务时将其他事务已经提交的数据覆盖掉;
(3)脏读:读到了其他事务未提交的更新数据;
(4)幻读:一次事务执行两次相同的查询,读到了不同的记录数;
(5)不可重复读:一次事务执行两次相同的查询,读到的结果不一样。
4.隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
读取未提交 | √ | √ | √ |
读取提交 | × | √ | √ |
可重复读 | × | × | √ |
序列化 | × | × | × |
当隔离级别是读取未提交时,一个事务可以读到另一个事务为提交的数据,脏读,幻读和不可重复读都有可能出现;
当隔离级别是读取提交时,两次读取到的数据都是已经提交的数据,但是一个事务在执行两次查询的中间,由于并发的原因,另外一个事务对这个数据进行了增加或者修改,则会造成幻读和不可重复读。
举例说明:
双十一进行抢购的时候,会有很多人同时购买商品,当你第一次查询商品种类的时候,可能有鞋子,包等等.但是隔了一秒之后,再次查询,包已经被抢购完,此时查询的商品种类和之前的数目不一样,这就是一种幻读。
同样的,当你下单买一种商品时,由于并发性,很多人同时抢购该种商品,两次查询得到的库存数不同,此时就是不可重复读。
当隔离级别是序列化时,所有的事务排队执行,效率非常差。