理解事务——原子性、一致性、隔离性和持久性

事务是指对系统进行的一组操作,为了保证系统的完整性,事务需要具有ACID特性,具体如下:

1. 原子性(Atomic)

一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。
回滚实际上是一个比较高层抽象的概念,大多数DB在实现事务时,是在事务操作的数据快照上进行的(比如,MVCC),并不修改实际的数据,如果有错并不会提交,所以很自然的支持回滚。
而在其他支持简单事务的系统中,不会在快照上更新,而直接操作实际数据。可以先预演一边所有要执行的操作,如果失败则这些操作不会被执行,通过这种方式很简单的实现了原子性。

2. 一致性(Consistency)

一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。事务的一致性决定了一个系统设计和实现的复杂度。事务可以不同程度的一致性:

  • 强一致性:读操作可以立即读到提交的更新操作。
  • 弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。
  • 最终一致性:是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。

其他一致性变体还有:

  • 单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。
  • 会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

3. 隔离性(Isolation)

并发事务之间互相影响的程度,比如一个事务会不会读取到另一个未提交的事务修改的数据。在事务并发操作时,可能出现的问题有:

  • 脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
  • 不可重复读:
    在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
  • 幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。

事务的隔离级别从低到高有:

  • Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
  • Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
  • Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
  • Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

通常,在工程实践中,为了性能的考虑会对隔离性进行折中。

4. 持久性(Durability)

     事务提交后,对系统的影响是永久的。

作者:chosen0ne
来源:CSDN
原文:https://blog.csdn.net/chosen0ne/article/details/10036775

python 树莓派 GPIO 控制 LED

前段时间买的电脑配件到货了,今天花点时间来学习了一下(顺便炸了一个 LED 灯泡),然后整理一篇树莓派硬件入门的文章:在树莓派上,使用 python 控制 GPIO 来点亮一个 LED 灯,虽然这么简单的实践随便一搜可以搜出一大把,但是零基础入门的时候还是有一些小小的坑,比如我就炸了一个灯泡(是真的炸开了 QWQ!)

Continue Reading...

Laravel 框架关键技术解析

前言:前段时间偶然看到了一本书,看了几章感觉写的还不错,很适合希望深入了解框架的人来读,网上只有 PDF 的版本,看起来还是不太方便,我认为学代码最好的方式还是看文档,毕竟有些代码复制粘贴起来方便,所以准备在这里重新排版成文章,有能力的朋友可以去支持一下正版

Continue Reading...

使用 screen 管理你的远程会话

你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

Continue Reading...

Ubuntu:修改主目录下分类的文件名

当时安装 ubuntu 的时候安装的是中文版,然后 home 文件夹里的分类文件夹也给改成了中文,然后每次 cd 进桌面的时候都要切一下输入法,今天凑个时间解决下,顺便水个文章(其实本来想水一个 sublime+Laravel 的文章的,结果插件一顿乱装,还是没 PHPstorm 好用 www)

Continue Reading...