数据库事务

事务的四个特性

数据库事务,简单来讲,就是把一堆的数据库操作(增删改查)组合成一个操作,这个操作要么成功,要么失败,如果成功,那么结果 就被更新到数据库中,如果失败,那就回滚,好像从来没有对数据进行操作过一样。

谈到事务,就一定会谈到事务的四个特性:ACID。

  • A:原子性。这个词语有点被滥用。在事务的特性中的意思是,整个事务就像一个原子操作,要么成功,要么失败:不成功,便成仁。
  • C: 一致性。一致性的意思其实是要保证数据的正确性,这其实更是由于应用来保证而不是数据库,毕竟如果写入的数据就是错的,数据库也没办法。
  • I:隔离性。这是指,多个事务之间互相不影响。
  • D:持久性。这是指,当事务完成之后,所做的变更应当持久化下来,也就是说,数据不会丢失。

事务隔离的四个级别

事务的隔离有四个级别:

  • 串行化:这是最高的隔离级别,事务一个接着一个执行,这样有一个缺点就是性能低,具体取决于实现,但是无论是单线程执行, 还是加锁来保证,由于要保证事务的执行顺序和收到请求的顺序一致,并且等待一个事务完成才执行下一个,性能会及其低下,并且受应用影响。

  • 可重复读:只要事务还没有结束,读取同一行数据就会得到相同的结果。这就是可重复读这个级别所做的保证,通常来说,可重复读已经 够了,但是还是有一种情况会出现“幻读”:

  • 提交读:事务只可以读到已经提交的数据。

read committed

这样不会出现脏读,但是会出现脏写:

read committed

  • 未提交读:这个级别最不靠谱,尚未提交的数据就能被其他事务读到,就会出现脏读。

MVCC

MVCC是多版本控制的意思,粗略来讲,实现方式就是对于每一行数据,如果发生了变更,那么会记录下老版本的数据,例如,原本数据 的值是A,版本是1,假设数据库里保存为A(1)。当变更为B时,数据库里保存的是A(1),B(2)。有两个问题:

  • 长久下去无用的老的值越来越多会不会占空间?会,所以要进行GC。
  • 索引怎么更新?索引也保存多个版本的值,当数据进行GC的时候,索引一起GC。还有一种方式就是,使用Append Only B-Trees,即, 每次写入B树的时候,都创建一个新的B树root节点,并且把要更新的节点和它的父节点拷贝过去,没有变的值保持不变。


更多文章
  • Linux高分屏支持
  • GCC默认的头文件搜索路径
  • 读《远见-如何规划职业生涯3大阶段》
  • 后端工程师学前端(五): SASS
  • 后端工程师学前端(四): CSS进阶(盒子模型)
  • 读《投资中最简单的事》
  • 后端工程师学前端(三): CSS进阶(特指度、单位和字体族)
  • 后端工程师学前端(二): CSS基础知识(规则与选择器)
  • Swift语法笔记
  • 后端工程师学前端(一): HTML
  • 读《管理的实践》
  • frp 源码阅读与分析(二):TCP内网穿透的实现
  • 五天不用微信 - 爽得很
  • frp 源码阅读与分析(一):流程和概念
  • 学习frp源码之简洁的在两个connection之间转发流量