数据库的四大特性以及四个隔离级别和引发的问题

四大特性(ACID)

1.原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响。

2. 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  例如:A和B进行转账操作,A有200块钱,B有300块钱;当A转了100块钱给B之后,他们2个人的总额还是500块钱,不会改变。

3. 隔离性(Isolation)

  隔离性是指当多个用户并发访问数据库时,比如同时访问一张表数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。
  例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要么在T1执行完成后才开始。将多个事务隔离开,每个事务都不能访问到其他事务操作过程中的状态;就好比上锁操作,只有一个事务做完了,另外一个事务才能执行。

4. 持久性(Durability)

  持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。

事务的隔离级别

  事务的隔离级别从低到高分别是:读未提交,读已提交,可重复读,串行化,这四个隔离级别可以分别解决脏读,不可重复读,幻读的问题。

读未提交:

  如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现;也就是读取未提交的数据。

  简单的说:我在读的时候你可以写也可以读,我在写的时候你不可以写,但是你可以读。

  读未提交会引发脏读

脏读:指的是一个事务在处理过程中读取了另一个事务没有提交的数据,读取数据不一致。

比如说:A欠B100块钱,某天A发了工资之后告诉B,我打算还你钱啦~A开启事务进行转账操作,转了100块钱给B(注意:并没有提交事务);这个时候A对B说,我已经把钱转给你了,你去查一下,确认了告诉我一下,然后B开启事务去查账户,发现金额确实增加了;然后对A说:“好,我已经收到钱了。我们两清了!”,这个时候A回滚事务,那么B读取的到就是脏数据——也就是脏读。

读已提交:

  读取数据的事务允许其他事务继续访问该行数据(允许写事务),但是未提交的写事务将会禁止其他事务访问该行。事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变——也就是引发了不可重复读。

  简单的说:我在读的时候你可以读也可以写,我在写的时候你不可以读也不可以写。

  不可重复读:

    一个事务A中发生了两次读操作,第一次读操作和第二次读操作之间,另一个事务B对数据进行了修改,这时两个事务读取的数据不一致。

可重复读:

  读取数据的事务将会禁止其他事务进行写事务(但允许读事务),写事务则禁止任何其他事务(可以通过“共享读锁”和“排他写锁”来实现),避免了脏读和不可重复读,但是会引发幻读。

  简单的说:我在读的时候你可以读,但是不可以写,我在写的时候你啥都不能做。

????

串行化:

  禁止任何事务,事务只能一个接着一个地执行,但不能并发执行;序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

猜你喜欢

转载自www.cnblogs.com/shan-kylin/p/9543294.html