chapter01_MySQL架构_3_事务

  • ACID定义

    (1) 原子性

    一个事务是一个单独的内部不可分的工作单元

    (2) 一致性

    数据库总是从一种一致性状态转换到另一种一致性状态

    (3) 隔离性

    某个事务的结果只有在完成以后才对其他事务可见

    (4) 持久性

    一旦一个事务提交,事务所做的数据改变将是永久的

    事务将导致数据库服务器要完成更多的额外工作

  • 隔离级别

    (1) 四个隔离级别

    1° READ UNCOMMITED

    2° READ COMMITED

    大多数数据库系统的默认隔离级别(但是不是MySQL的默认隔离级别)

    3° REPEATABLE READ

    MySQL的默认隔离级别,包括InnoDB、Falcon这两种支持事务的存储引擎,支持的都是这一种

    4° SERIALIZABLE

    (2) 越高等级的隔离级别,会导致数据安全性越强,但是带来的问题是系统开销更大

    (3) MySQL中可以设置隔离级别

      SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITED;
    

    MySQL可以识别4个隔离级别,但是不同存储引擎对于隔离级别的支持程度不一样(InnoDB是支持4个隔离级别的)

  • 死锁

    (1) 为了解决死锁,数据库系统实现了各种死锁检测和死锁超时机制

    (2) InnoDB处理死锁的方式:回滚拥有最少排他行级锁的事务

  • 事务日志

    (1) 传统的处理方式是:每次数据改变,都更新对应的磁盘中的记录

    (2) 引入日志以后的处理方式是:

    1° 更新数据在内存中的拷贝

    2° 写更新数据的日志(日志保存在磁盘上)

    3° 更新磁盘中的记录

    这样做的好处是__更快__,因为1°和2°都是快操作(写日志不需要磁盘的随机移动),而3°可以在时间空闲时完成

  • MySQL中不是所有的事务都是支持存储引擎的,常见的例如InnoDB就是支持事务的存储引擎,MyISAM就是不支持事务的存储引擎

  • MySQL中的事务

    (1) MySQL提供了3个事务型存储引擎(也就是说其他存储引擎是不支持事务的)

    InnoDB, NDB Cluster, Falcon

    (2) MySQL默认__AUTOCOMMIT__

    1° 定义:

    如果没有显式START TRANSACTION,那么每个操作都会变成单独一个事务来执行

    2° SET AUTOCOMMIT = 0可以把自动提交模式关掉,这样做的效果是用户将一直处于某个事务中,直到用户执行COMMIT或ROLLBACK才开启新事务

    3° 对于事务型存储引擎,SET AUTOCOMMIT = xxx才有用;对于不支持事务的存储引擎,设不设置效果是一样的,一直工作在AUTOCOMMIT模式

    (3) 一些命令可以使得事务提前提交,例如ALTER TABLE、LOCK TABLE等命令

    (4) MySQL没有在服务器层(第一层)处理事务,而是在存储引擎层(第三层)处理事务,这导致了如果在事务中__混合__使用了事务型存储引擎的表和非事务型存储引擎的表,在需要回滚时非事务型存储引擎的表无法回滚,导致出现数据不一致的情况

    所以,尽量不要混合处理

    (5) MySQL中一个事务在执行过程中的任意时候都可以获得锁,但是只有COMMIT和ROLLBACK的时候才能释放锁(并且同时释放所有锁),这种属于__隐式锁定__

    LOCK TABLES/UNLOCK TABLES可以进行__显式锁定__,但是最好不要用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值