数据库相关概念

分布式数据库

事务

  1. 什么是事务?
  • 事务就是并发 + 锁
  • 事务就是为了保证数据的一致性,ACID保证事务的完整性
  1. 事务单元
  • 商品要建立一个基于GMT_Modified的索引
  • 从数据库中写入一行记录,同时更新这行记录的所有索引。
  • 删除整章表
  • Etc
  1. 事务单元之间的Happen-before关系
  • 读写 写读 读读 写写
  1. 如何以更快的速度完成?又能保证上面四种操作的逻辑顺序?
  • 排队法 优点: 不需要冲突控制,缺点:太慢
  • 排他锁
  • 读写锁 读读 和 读写做优化
  • MVCC 多版本并发控制 主流数据库实现的方法
    本质来说就是copy on write 能够做到写不阻塞读。
    在写的时候可以做并发读。读读,读写,写读都不冲突。
    系统实现很复杂。

事务处理常见问题

  1. 多个事务,谁先谁后?
  • 一个读请求应该读哪一个写之后的数据?(MVCC)
  • 解决方法: 逻辑时间戳数据的自增号,写一次加一
    SCN(Oracle)
    Trx_id(Innodb)
    Etc
  1. 如何恢复故障?
  • 业务属性不匹配 恢复: 记住执行操作的反操作的log,然后进行回滚
    系统崩溃 恢复: 数据恢复,系统没有恢复完成时,不可以对外提供服务
  1. 碰到死锁了怎么办?
  • 死锁检测和死锁;死锁产生的原因:两个线程,不同方向,相同的资源
  • 死锁的解决方案:尽可能不死锁,碰撞检测,等锁超时

深入单机事务

  1. 事务的ACID
  • 原子性
    一个事务要么同时成功,要么同时失败
    undo日志回滚到之前的版本
  例子:ver1 Bob有100元,Smith有0元
       ver2 Bob有0元,Smith有0元
       (undo: Bob有100元,Smith有0元)
       ver3 Bob有0元,Smith有100元
       (undo: Bob有0元,Smith有0元)
  • 一致性
    Can(Happen before), 保证能看到系统内的所有更改。
    两个事务同时发生,处理不同事务的读写并行,就是处理一致性的重要问题。

  • 隔离性
    以性能为理由,对一致性的破坏。
    序列化读写(Serializable) 排他锁 单位时间内只有一个事务可以执行。
    读写锁:

    可重复读(Repeatable Read)
    读锁不能被写锁升级,只能做到读读并行

    读已提交(Read Committed)
    读锁可以被写锁升级,读读并行,读写并写(写读不能)
    出现了不可重复读

    读未提交(Read Uncommited)
    只加写锁,读不加锁
    读读并行,
    读写并行
    写读并行
    问题:
    可能读到写过程中的数据

    隔离性小结:
    SQL92标准定义的隔离性
    序列化,可重复读,读已提交,读未提交
    隔离性扩展:
    快照(Snapshot Isolation)
    多版本并发控制(MVCC)
    核心思想:
    copy on write + 无锁编程。

    快照隔离性:

    • 针对读多写少场景优化
    • 并行度能达到或超过读未提交,而隔离级别很高
    • 快照读的情况能保证读到一致性的同时实现读未提交
    • 实现了MVCC的系统,快照读几乎等同于序列化读
      写写有没有可能并行?
      事务就是多个不同的命令组装到一起的过程。
  • 持久性
    事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中。
    RAID的持久性:
    数据丢失的可能:1磁盘的物理损坏。2每一次commit都要fsync到磁盘中----->系统性能的下降。持久性 ---> 延迟
    RAID Controller要保证同时成功和失败。
    1.提交请求到内存后返回(内存的数据容易丢失)
    2.如何将内存的数据打包到磁盘(Group Commit提升系统的吞吐量)
    持久性(扩展:持久性保证策略)
    核心目的:提升并行度

  1. 单机事务的典型异常对应策略
  • 业务属性不匹配
    回滚

  • 系统DOWN机
    事务的原子性操作只有一个标记commit
    commit完成时,之后的请求必须正常的完成
    重启后进入recovery模式:

    • 提交后事务单元继续完成提交

    • 未提交事务单元回滚

    Recovery

    • 过程是原子性操作,要保证ACID
    • 进程挂掉,重启recovery
    • 记录日志,保证不会出现数据丢失
  1. 事务的调优原则
    在不影响业务应用的前提下
  • 减少锁的覆盖范围
    • Myisam表锁 --> Innodb 行锁
    • 原位锁 --> MVCC版本
  • 增加锁上可并行的线程数
    • 读锁写锁分离、允许并行读取数据
    • 多线程并行读取
    • 允许更多人读取
  • 选择正确锁类型
    • 悲观锁:使线程到blocking状态,通知信息Ok的状态切换回等待状态,适合并发争抢比较严重的场景
    • 乐观锁:适合并发争抢不太严重的场景
  1. 单机事务拾疑
  • 事务单元扩展
    事务单元

    • 商品要建立一个基于GMT_Modified的索引

    • 从数据库中读取一行记录

    • 删除整张表

    • 向数据库中写入一行记录,同时更新这行记录

    • Etc

    一组事务单元

    • Bob给Smith100

    • Joe领了100

    • Smith给了Bob100
      Two Phase lock

    BeginTrx
    Read from A(lockA)
    Read from B(lockB)
    A - 100
    B + 100
    Commit(unlockA,unlockB)
    
  • 死锁扩展 - U锁(更新锁)

    • 可重复读隔离级别下:
    Tx1 申请A读锁成功
    Tx2 申请A读锁成功
    Tx1 申请A读锁升级-等待Tx2读锁释放
    Tx2 申请A读锁升级为写锁-等待Tx1读锁释放
    
    • Update set A = A-1 where id = 100 多个线程会死锁
    • U 锁:
      当探测到有写操作的时候,自动将读锁升级为写锁。
  • MVCC拾遗

    • 针对读多写少的场景优化
    • 并行度能达到或超过读未提交,而隔离级别很高

分布式事务

目标:像传统单机事务一样的操作,可按需无限扩展
分布式数据库的尝试与问题

  • 什么是事务
    无论怎么伪装:我们在玩的仍然是个图灵机。
  • 网络带来的,网络失去的
  • 基于锁的事务实现中遇到的问题
    • 从2PL到2PC
    • 分布式事务异常处理
    • 分布式日志记录
    • 分布式事务延迟变大问题
  • 结合MVCC的事务实现中遇到的问题
    • 分布式顺序问题

本文为https://www.imooc.com/learn/272的课程笔记,如有侵权立删。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,961评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,444评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,009评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,082评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,101评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,271评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,738评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,395评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,539评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,434评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,481评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,160评论 3 317
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,749评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,816评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,038评论 1 256
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,548评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,140评论 2 341

推荐阅读更多精彩内容