zoukankan      html  css  js  c++  java
  • 学习总结---INNODB 事务并发

    目前在做一个OLTP的数据库系统,批量读写和随机读写并发,情况比较复杂。INNODB是我们的MYSQL引擎,他的主要特点是读操作可以不受阻塞,而修改操作会加锁。如何才能最高效的使用innodb是我们需要解决的问题。为此我研究了innodb的在线文档。文中不确切的地方敬请指正。

    INNODB的读数据总是一致的,如果在Session-1读的过程中,Session-2对数据进行修改,不管session-2是否提交,在session-1的事务中都会读到修改前的值。读操作保持一致性并不受阻塞的原因是多版本机制。所谓多版本机制是指innodb会保存被修改数据的旧版本,以支持并发和回滚。多版本也决定了delete操作不会立刻导致数据从数据文件移除,而是等事务log被清理的时候才删除。多版本机制的关键是undo和redo事务日志,每行为支持多版本包含3个域:

    DB_TRX_ID最近一次修改或者插入该行的事务号;这会决定某个select是否能获取到某行数据;

    Db-roll-ptr指向undo日志的操作;

    DB_ROW_ID递增的行版本号;

    如果执行的不止是select操作,而是select for update,或者select for share lock,则会在对应的数据上加上lock,目前innodb支持3种锁:

    Record lock,锁定一条记录,加载index上;

    Gap lock 锁定一个记录区间,如果通过唯一性索引进行select则不会导致gap lock,因为record lock就够了;

    Next key locks结合了上面两种,用于搜索并阻止“幻读”,因为该锁不仅能锁住检索到的行,还会锁住该记录前面的记录集合,这样如果加了锁insert就不会成功。需要注意的是如果检索的不是索引,或者没有检索到结果,lock会加在整个表上,导致其他的排它锁不能申请成功。

    这就要求我们在做update的时候必须以索引作为过滤条件,并且尽快结束。

  • 相关阅读:
    Angular 双向数据绑定
    Angular 过滤器
    Angular 自定义指令传参
    润滑油 标号
    Oracle concat
    sqlldr load UTF8 error
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    shell 执行结果赋给变量
    linux 如何显示一个文件的某几行(中间几行)
    linux shell date 用当天时间做备份文件名
  • 原文地址:https://www.cnblogs.com/alphablox/p/3400253.html
Copyright © 2011-2022 走看看