• 数据库事务解析


    1. 事务定义

    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列读或写操作。
    其目的是提供三种方法:
    1. 失败恢复到正常状态的方法
    2. 保持一致性的方法
    3. 并发操作之间保持隔离的方法,

    2. 事务特性(ACID)

    1. 原子性(Actomicity)

    该系列操作作为一个整体,不能被分割,要么全执行,要么都不执行;

    2. 一致性(Consistency)

    确保数据从一种状态变为另一种状态;

    3. 隔离性(Isolation)

    多个事务并发执行时,彼此之间互不影响;

    4. 持久性(Durability)

    当事务提交成功后,对数据的修改要永久保存在数据库中。

    3. 并发异常

    1. 回滚丢失

    由于一个事务的失败回滚导致另一个事务的更新丢失了

    2. 覆盖丢失

    更新被其他事务给覆盖了

    3. 脏读

    一个事务读取了另一个事务修改未提交的数据

    4. 不可重复读

    一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果

    5. 幻读

    当一个事务查询记录两次或多次时,得到的数量不一致

    4. 隔离级别

    1. 读未提交

    一个事务的更新语句没有提交,但是别的事务可以读到这个改变

    2. 读已提交

    一个事务只能看到其他事务已经提交的更新、看不到未提交的更新,消除了脏读和回滚丢失,Oracle/Sqlserver就是此类

    3. 可重复读

    • 一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的
    • 只要存在读修改行数据就禁止写,消除了不可重复读和覆盖丢失
      - 需要注意的是虽然Mysql的默认事务隔离级别为可重复读,理论上是不能解决幻读异常的,但由于Next-key,Gap-lock的存在,使得Mysql可以避免幻读问题。

    4. 串行化

    当前事务执行时,不允许其他事务操作,只要存在读就禁止写,但可以同时读,消除了幻读,但是效率太低。

    5. 隔离级别与并发异常对应关系

    隔离级别并发异常 回滚丢失 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 覆盖丢失 幻读(Phantom Read)
    读未提交(Read uncommitted)
    读已提交(Read committed)
    可重复读(Repeatable read)
    串行化(Serializable)

    6. 事务相关命令

    -- 查看数据库版本:
    select version();
    
    -- 查看隔离级别:
    select @@session.tx_isolation;
    
    -- 修改隔离级别:
    set @@session.tx_isolation=参数;
    -- 可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
    
    -- 开启事务:
    start transaction;
    
    -- 提交:
    commit;
    
    -- 回滚:
    rollback;
    
    -- 查看事务
    select * from information_schema.INNODB_TRX;
    
    -- 查看锁
    select * from information_schema.INNODB_LOCKS;
    
    -- 查看锁等待
    select * from information_schema.INNODB_LOCK_WAITS;
    
    

    7. INNODB_TRX

    1. 用途

    提供有关当前在InnoDB内执行的每个事务(只读事务除外)的信息,包括事务是否正在等待锁、事务何时开始以及事务正在执行的SQL语句(如果有)。

    2. 参数解析

    列名 描述
    TRX_ID 事务ID
    TRX_WEIGHT 事务的权重,反映(但不一定是确切的计数)更改的行数和事务锁定的行数。要解决死锁,InnoDB选择权重最小的事务作为回滚的“ 受害者 ”。无论更改和锁定行的数量如何,已更改非事务表的事务都被认为比其他事务更重。
    TRX_STATE 事务执行状态。允许值是 RUNNING,LOCK WAIT, ROLLING BACK,和 COMMITTING。
    TRX_STARTED 事务开始时间。
    TRX_REQUESTED_LOCK_ID 事务当前正在等待的锁的ID,如果TRX_STATE是LOCK WAIT; 否则NULL。
    TRX_WAIT_STARTED 交易开始等待锁定的时间,如果 TRX_STATE是LOCK WAIT; 否则NULL。
    TRX_MYSQL_THREAD_ID MySQL线程ID,与show processlist中的ID值相对应
    TRX_QUERY 事务正在执行的SQL语句
    TRX_OPERATION_STATE 交易的当前操作,如果有的话; 否则 NULL。
    TRX_TABLES_IN_USE InnoDB处理此事务的当前SQL语句时使用 的表数。
    TRX_TABLES_LOCKED InnoDB当前SQL语句具有行锁定 的表的数量。(因为这些是行锁,而不是表锁,所以通常仍可以通过多个事务读取和写入表,尽管某些行被锁定。)
    TRX_LOCK_STRUCTS 事务保留的锁数。
    TRX_LOCK_MEMORY_BYTES 内存中此事务的锁结构占用的总大小
    TRX_ROWS_LOCKED 此交易锁定的大致数字或行数。该值可能包括实际存在但对事务不可见的删除标记行
    TRX_ROWS_MODIFIED 此事务中已修改和插入的行数。
    TRX_CONCURRENCY_TICKETS 一个值,指示当前事务在被换出之前可以执行多少工作
    TRX_ISOLATION_LEVEL 当前事务的隔离级别。
    TRX_UNIQUE_CHECKS 是否为当前事务打开或关闭唯一检查。例如,在批量数据加载期间可能会关闭它们
    TRX_FOREIGN_KEY_CHECKS 是否为当前事务打开或关闭外键检查。例如,在批量数据加载期间可能会关闭它们
    TRX_LAST_FOREIGN_KEY_ERROR 最后一个外键错误的详细错误消息(如果有); 否则NULL
    TRX_ADAPTIVE_HASH_LATCHED 自适应哈希索引是否被当前事务锁定。当自适应哈希索引搜索系统被分区时,单个事务不会锁定整个自适应哈希索引。自适应哈希索引分区由innodb_adaptive_hash_index_parts,默认设置为8。
    TRX_ADAPTIVE_HASH_TIMEOUT 是否立即为自适应哈希索引放弃搜索锁存器,或者在MySQL的调用之间保留它。当没有自适应哈希索引争用时,该值保持为零,语句保留锁存器直到它们完成。在争用期间,它倒计时到零,并且语句在每次行查找后立即释放锁存器。当自适应散列索引搜索系统被分区(受控制 innodb_adaptive_hash_index_parts)时,该值保持为0。
    TRX_IS_READ_ONLY 值为1表示事务是只读的。
    TRX_AUTOCOMMIT_NON_LOCKING 值为1表示事务是 SELECT不使用FOR UPDATE 或 LOCK IN SHARED MODE子句的语句,并且正在执行, autocommit因此事务将仅包含此一个语句。当此列和TRX_IS_READ_ONLY都为1时,InnoDB优化事务以减少与更改表数据的事务关联的开销

    9. INNODB_LOCKS

    1. 用途

    提供有关InnoDB事务已请求但尚未获得的每个锁的信息,以及事务所持有的阻止另一个事务的每个锁的信息。

    2. 参数解析

    列名 描述
    LOCK_ID 一个唯一的锁ID号,内部为 InnoDB。
    LOCK_TRX_ID 持有锁的事务的ID
    LOCK_MODE 如何请求锁定。允许锁定模式描述符 S,X, IS,IX, GAP,AUTO_INC,和 UNKNOWN。锁定模式描述符可以组合使用以识别特定的锁定模式。
    LOCK_TYPE 锁的类型
    LOCK_TABLE 已锁定或包含锁定记录的表的名称
    LOCK_INDEX 索引的名称,如果LOCK_TYPE是 RECORD; 否则NULL
    LOCK_SPACE 锁定记录的表空间ID,如果 LOCK_TYPE是RECORD; 否则NULL
    LOCK_PAGE 锁定记录的页码,如果 LOCK_TYPE是RECORD; 否则NULL。
    LOCK_REC 页面内锁定记录的堆号,如果 LOCK_TYPE是RECORD; 否则NULL。
    LOCK_DATA 与锁相关的数据(如果有)。如果 LOCK_TYPE是RECORD,是锁定的记录的主键值,否则NULL。此列包含锁定行中主键列的值,格式为有效的SQL字符串。如果没有主键,LOCK_DATA则是唯一的InnoDB内部行ID号。如果对键值或范围高于索引中的最大值的间隙锁定,则LOCK_DATA 报告supremum pseudo-record。当包含锁定记录的页面不在缓冲池中时(如果在保持锁定时将其分页到磁盘),InnoDB不从磁盘获取页面,以避免不必要的磁盘操作。相反, LOCK_DATA设置为 NULL。

    10. INNODB_LOCK_WAITS

    1. 用途

    为每个阻止的InnoDB事务包含一个或多个行,指示它请求的锁和阻止该请求的任何锁。

    2. 参数解析

    列名 描述
    REQUESTING_TRX_ID 请求(阻止)事务的ID。
    REQUESTED_LOCK_ID 事务正在等待的锁的ID。
    BLOCKING_TRX_ID 阻止事务的ID。
    BLOCKING_LOCK_ID 由阻止另一个事务继续进行的事务所持有的锁的ID

    11. 参考

  • 相关阅读:
    查看linux版本的三种常用方法
    CentOS和Redhat发行版linux内核版本的对应关系
    swift的异常处理:本质是错误信息的传递方式
    构建法则第一条:有什么材料做什么饭
    待解决问题 代码阅读
    iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
    整合与构建的能力是创造性思维的重要体现
    iOS网络缓存的系统实现是一个烂尾工程
    (动态)代理于HOOK的区别于关系
    iOS 网络缓存总结
  • 原文地址:https://www.cnblogs.com/yueyun00/p/10703742.html
Copyright © 2020-2023  润新知