美文网首页
数据库事务原理

数据库事务原理

作者: 谭英智 | 来源:发表于2021-09-04 17:37 被阅读0次

    什么是事务

    保证一连串的读写操作的原子性,要么全部成交,要么全部回退。

    它解决了什么

    不同的事务机制解决不同的问题

    • 脏读(读已提交)

      读到未提交的数据

    • 不可重复读(可重复读)

      数据被update前后,导致两次查询不一样

    • 幻读(可串行化)

      数据被delete/add前后,导致两次查询不一样

    它的特性

    ACID

    • A:原子性
    • C:一致性
    • I:隔离性
    • D:持久化

    事务模型

    • 平板事务

      所有的操作,要么全部成功,要么全部失败

    • 带保存点的平板事务

      在整个事务的周期内,可以设置不同的保存点,可以前面的保存点成交,后面的回滚掉

    • 链式事务

      事务提交后,环境可以保存,并给下一个事务继续使用

    • 嵌套事务

      整个事务是一课树,子树可以局部成交,只有根节点成交,整个事务才算成交

    • 分布式事务

      在分布式环境的事务

    • 多层次事务

      整个事务是一棵树,每颗节点的事务类型可以不一样,子树可以局部成交,只有根节点成交,整个事务才算成交

    并发控制

    并发技术是在保证事务实现的正确性,为了提高并发的性能,牺牲一部分的一致性。在性能与正确之前取一个平衡值

    并发控制类型

    乐观并发控制

    开始时,任何操作都被允许;只有在事务提交的时候,进行有效性检验,如果通过,则事务提交,否则回滚。

    乐观控制适合冲突少的场景

    基于有效性确认的并发控制是乐观控制

    悲观并发控制

    在执行每个操作的时候,都进行有效性检验,如果检验不过,则回滚或者阻塞

    悲观控制适合冲突多的场景

    基于两阶段锁和基于时间戳排序的并发控制技术都属于悲观技术

    并发控制实现技术

    时间戳排序并发控制技术

    • 每个事务在开始时赋予一个时间戳
    • 进行read的时候,判断此记录是否被一个更后的时间戳写过,如果写过,则回滚(read - write check)
    • 进行write的时候,判断此记录是否被一个更后的时间戳写过,如果写过,则回滚(write - write check)
    • 提交事务

    基于有效性确认的并发控制技术

    • 每个事务在开始时赋予一个序号
    • 进行read/write时直接通过
    • 在commit的时候判断是否符合冲突可串行化,如果符合,则提交,否则回滚

    两阶段锁并发控制技术

    • 在事务提交之前的read和write分别对数据项进行加读写锁
    • 如果有其他事务对数据项进行读写,则要判断锁是否允许进行读写,如果不行,则阻塞
    • 事务提交阶段,进行锁释放

    多版本并发控制技术

    解决两阶段锁的性能低下的问题。

    它主要提升了read - write的性能。通过对数据项引入多版本。

    • 在事务中,对数据项进行write的时候,不上锁,而是对数据项写入一个新版本
    • read的时候,读取版本低于自己的数据项
    • write的时候,如果发现数据项已经被write了,而且没有提交,则阻塞
    • 最后提交事务,对数据项多版本进行清理

    基于索引的并发控制技术

    在索引上进行上锁,来控制并发

    可以通过在索引上施加next-key locking来解决幻读问题

    日志技术

    REDO日志

    为了提高数据写入磁盘的效率,数据在提交时,并不马上写入磁盘,如果数据库重启或者奔溃。可以通过REDO日志恢复数据

    REDO log通过重新执行数据,可以把已提交的数据写入磁盘

    UNDO日志

    对于未提交的事务或者回滚的事务,UNDO log通过混滚相应的数据操作,对数据进行恢复

    相关文章

      网友评论

          本文标题:数据库事务原理

          本文链接:https://www.haomeiwen.com/subject/trwrwltx.html