MySQL - 事务

248 阅读2分钟

哈,好久没写笔记了,最近闲来无事和大家分享一些 Mysql 事务方面的小知识吧!

  • 嗯~~ 关于事务的介绍就不写了,网上资料太多了,大家获取起来很方便!我比较务实,直接进入主题吧,介绍一点关键性的东西 (其实是因为懒,手动滑稽)

【1-0】: 首先事务的界定

    一个完整的事务需满足如下四个特性,也就是我们常说的 'ACID'
    - '原子性(Atomicity)'
    - '一致性(Consistency)'
    - '隔离性(Isolation)'
    - '持久性(Durability)' 

【1-1】: 事务设置

    查询当前事务隔离级别
    'mysql> select @@tx_isolation; '
    
    修改事务隔离级别
       (方法1): 'mysql> set 执行方式 transaction isolation level 隔离级别;'
        (方法2): 'my.cnf或my.ini配置文件中mysqld下添加 transaction-isolation = 隔离级别' 
        
    [解释:执行方式]
        'global' 设置后将影响之后所有的session,而当前已经存在的session不会受到影响。
        'session' 设置后将影响之后所有的session,包括当前正在运行的session 【推荐】
        
    [解释:隔离级别]
        'read uncommitted' 读未提交
        'read committed'   读已提交
        'repeatable'       可重复读
        'serializable'     可串行化
    

【1-2】: 隔离级别差异对比

    读未提交: 脏读(√)   不可重复读(√)    幻读(√)
    读已提交: 脏读(×)   不可重复读(√)    幻读(√)
    可重复读: 脏读(×)   不可重复读(×)    幻读(√)
    可串行化:  脏读(×)   不可重复读(×)    幻读(×)
    
    [解释:脏读]
        '最简单的理解, 假设一个查询语句读取到了另外一条还未提交的事务修改后数据
        (万一你回滚了我咋办)'
    [解释:幻读]
        '假设事务A执行了一条SQL(select * from xxx where sum > 10) 此时结果为空, 
        事务B执行了另外一条SQL (update xxx set sum = 11) ,并完成提交
        事务A在执行(update xxx set xxx = xxx where sum > 10 ), 会发现有1条数据被更新了'
    [解释:不可重复读]
        '假设事务A执行的一条查询SQL此时得到的结果为2, 事务B执行了一条修改SQL
        将记录改成了1并提交了, 此时事务A实际拿到的值就成1了'