美文网首页
数据库事务一致性与锁

数据库事务一致性与锁

作者: 光谷电锯狂魔 | 来源:发表于2019-10-18 17:20 被阅读0次

对大多数SQL DB

事务:

由一系列数据库操作组成的一个不可拆分的逻辑过程

事务的特性(ACID):

  • 原子性(Atomicity):事务中所有操作必须全部完成。否则回滚为初始状态
    例如:删除某个商品(需要删除商品,评价,订单等多个表)
  • 隔离性(Isolation):事务之间不会互相影响导致数据错误,分为四个级别(见下)
  • 持久性(Durability):事务完成后数据不会因为系统故障而丢失
  • 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。由上面三者共同保证。

不一致的情况:

  • 脏读(Dirty Read):
    一个事务读取到另一个事务还未提交(可能回滚)的数据
时间 事务A 事务B
T1 开启事务 开启事务
T2 查询金额为100
T3 金额加10
T4 查询金额为110(脏读)
T5 金额加10 回滚,金额还原为100
T6 commit
T6 金额变为120
  • 不可重复读(Non-repeatable read):
    同一个事务内,两个相同的查询返回了不同的结果
时间 事务A 事务B
T1 开启事务 开启事务
T2 查询金额为100 查询金额为100
T3 金额加10
T4 commit
T5 查询金额为110(不可重复读)
  • 幻读(Phantom read):
    特殊的不可重复读,在事务2进行插入或删除时发生
时间 事务A 事务B
T1 开启事务 开启事务
T2 查询学生分数
T3 新增一个学生的分数
T4 commit
T5 将所有学生百分制分数改为ABCDE等级
T6 commit
T6 发现还存在一个百分制的分数(幻读)
  • 修改丢失
    一个事务的提交被另一个事务提交覆盖
时间 事务A 事务B
T1 开启事务 开启事务
T2 查询金额为100 查询金额为100
T3 金额加10
T4 commit,金额变为110
T5 金额加20
T6 commit,金额变为120 (修改丢失)

隔离级别:

  • 读未提交(Read uncommttied)
    • 读数据无锁,写数据瞬间时加行锁 -> 避免同时写入
  • 读已提交(Read committed)
    • 读数据时瞬间加行级共享锁,操作完成即释放
    • 写数据时加行级排它锁,直到事务结束
    • 解决的问题?
  • 可重复读(Repeatable read)
    • 读数据的时候加行锁,直到事务结束
    • 解决的问题?
  • 可串行化(Serializable)
    • 读数据的时候加表锁,直到事务结束
    • 解决的问题?

锁类型

  • 行锁
  • 表锁
  • 共享锁(读锁):本事务可读,不可写;其它事务可读,不可写
  • 排它锁(写锁):本事务可读写;其它事务不可读写

数据库的事务隔离解释
数据库隔离级别的实现

对MongoDB

MongoDB的ACID特性

  • 只能保证单文档ACID,不支持跨文档事务(4.0已支持)
  • 在更新单文档时会对其加锁:Intent Lock

锁类型

  • 意图锁(Intent Lock)& 非意图锁(Non intent lock)
    操作方对要操作的文档加Non Intent Lock,并对所有外层加intent lock。
    image.png
  • Multiple granularity locking
    混合了多种锁,包括
    • 共享锁-S(Shared lock)
    • 排它锁-X(Exclusive lock)
    • 意图共享锁-IS(Intent Share lock)
    • 意图排它锁-IX(Intent Exclusive lock)


      image.png

MongoDB的事务、ACID和一致性
五个解决方案让MongoDB拥有RDBMS的鲁棒性事务

问题:怎么使用Reactive Mongo Transaction?

乐观锁 vs 悲观锁

相关文章

  • Sql server中的事务与锁

    了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器。 锁:多用户访问同一数据库资源时,对访问的先后次...

  • [转]SQL Server中的事务与锁

    转自SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器。 锁:多用...

  • 搞懂Redis(四)-Redis事务

    事务本质:一组命令的集合 数据库事务与Redis事务 数据库事务数据库事务通过ACID(原子性.一致性.隔离性.持...

  • 数据库相关概念

    分布式数据库 事务 什么是事务? 事务就是并发 + 锁 事务就是为了保证数据的一致性,ACID保证事务的完整性 事...

  • 知识点整理

    redis redis为什么高效,及应用场景 锁 死锁产生条件,及避免死锁 悲观锁与乐观锁 数据库 事务 事务特性...

  • 乐观锁,悲观锁详解

    并发控制 并发控制:当多个连接对记录进行修改的时保证数据的一致性。 悲观锁,乐观锁 确保在多个事务同时存取数据库中...

  • 两端锁协议

    1、数据库锁 数据库锁粒度划分:行锁、页锁、表锁。共享锁:读锁、S锁。事务T可以对A进行读取,其他事务只能读取而不...

  • MySQL 事务及四个特性

    为什么需要事务? 用户对数据库的访问是多程序多线程的,为了维护数据的一致性,我们需要事务.(间隙锁会相关) 目前只...

  • 数据库如何加锁?锁是用来干嘛的?

    数据库中的共享锁与排它锁 共享锁(S锁),又称为读锁,如果数据对象加上共享锁之后,则该数据库对象可以被其他事务查看...

  • 事务基础理论

    数据库中的事务理论 事务的特征(ACID) 原子性 要么一起成功要么一起失败 一致性 一致性是指事务必须使数据库从...

网友评论

      本文标题:数据库事务一致性与锁

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