纪念里程碑式的今天,把《java并发编程的艺术》第一遍,很多的知识,还是需要第二遍看,甚至第三边看,才能彻底领悟。
同时最近也是感觉,很多的知识,并不应该停留在,我知道它,但是具体细节忘记了,我百度查一下。这样并不能说明什么。反而,会觉得你是个半瓶子。现在感觉,特别想去记住一些东西。
来吧,今天复习的主题——数据库的四大特性和隔离级别;
1,数据库的四大特性,我记得是ACID,实际上是:A:原子性(Atomicity),C:一致性(Consistency),I:隔离性(Isolation),D:持久性(Durability);
a,A:原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和事务的功能是一样的概念。
b,C:一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
c,I:隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。mysql的last_insert_id也是基于连接的。并不能看到其他事务更新的最新id。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
d,D:持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
好,隔离级别如下:
隔离级别/现象 | 脏读 | 不可重复读 | 幻读 |
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
a,未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
b,提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
c,可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
d,串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
如有侵权,请联系fzg12091@163.com