数据库四大特性和隔离级别小记

数据库四大特性

数据库的四大特性缩写为ACID,分开来说就是原子性(A tomicity)、一致性(C onsistency)、隔离性(I solation)、持久性(D urability)。事务是访问并可能更新各种数据项的一个程序执行单元。我们要求数据库系统维护事务的ACID性质。

  • 原子性:事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
  • 一致性:隔离执行事务时(在没有其他事务并发执行的情况下)保持数据库的一致性。
  • 隔离性:指并发的事务是相互隔离的。
  • 持久性:一个事务成功完成后,它对数据库的改变必须是永久的,即使出现系统故障。

一个银行转账的例子:
假设A账户中有1000元,B账户有2000元,存在一个事务,账户A向账户B转账50元。

  • 原子性:A在向B转账过程中,出现了系统故障,A账户剩余950元,而B账户未收到转账,依旧为2000元,此时状态称为不一致状态,为了维护事务的原子性,我们需要从日志中恢复旧值(对于写操作,数据库系统在磁盘上记录其旧值,这个信息记录在一个称为日志的文件中),此时A账户恢复为1000元,B账户为2000元。
  • 一致性:此时的一致性,要求转账前后A+B的账户总金额不变。
  • 隔离性:假设在转账过程中,A账户金额转出50元,而B账户金额未到账,此时存在并行事务T想要读取A、B账户金额总和,若此时读取,会读到不一致数据,此时解决方案之一是让T事务在转账完成后串行执行。关于并发事务的隔离级别,下文会有更详细的介绍,为了保证数据库的高效性,实际系统中有更多的并发控制方案。
  • 持久性:一旦转账成功执行,系统就必须保证任何系统故障都不会引起与这次转账相关的数据丢失。

事务隔离性级别

为了提高数据库系统的资源利用率和吞吐量以及减少等待时间等,事务处理系统允许多个事务并发的执行。由此承接银行转账例子中的隔离性,为了保证数据库的高并发性,SQL标准允许事务以一种不可串行化的方式执行。存在以下几个隔离性级别:

  • 可串行化(serializable):并发事务以串行方式执行。
  • 可重复读(repeatable read):只允许读取已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据。
  • 已提交读(read committed):只允许读取已提交数据,但不要求可重复读。比如,在事务两次读取一个数据项期间,另一个事务更新了该数据并提交。
  • 未提交读(read uncommitted):允许读取未提交数据。最低一致性级别。

以上所有隔离级别都不允许脏写,即如果一个数据项已经被另外一个尚未提交或中止的事务写入,则不允许对该数据项执行写操作。
与隔离性相关的几个名词:
脏读:指一个事务读取了另一个未提交的事务。
幻读(虚读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。一个事务中包含两次读操作,在第二次读之前,其他事务进行了修改,导致事务1两次读的结果不同。
mysql数据库默认的事务隔离级别是:Repeatable read(可重复读)

参考链接:

猜你喜欢

转载自blog.csdn.net/Xtick/article/details/81224648