Mysql事务ACID特性

148 阅读2分钟

1.3.1 ACID:原子性、一致性、隔离性、持久性

  • 原子性(atomicity):事务被视为不可分割的最小工作单元,事务中的操作,全部成功 or 全部失败。
  • 一致性(consistency):数据库中的数据总是一致的。
  • 隔离性(isolation):提交读以上,事务所做的修改,提交之前不可见。
  • 持久性(durability):事务提交,所作修改 永远保存在数据库中。

1.3.2 隔离级别

  • 未提交读(READ UNCOMMITTED):事务中的修改未提交,其它事务也可见。读取未提交的数据称为脏读。
  • 提交读(READ COMMITTED):事务中的修改提交前,其它事务不可见。但是对于其它事务来说可能会读取到两次不同的数据,不可重复读。
  • 可重复读(PREPEATABLE READ):解决了脏读的问题,保证事务多次读取同一记录的结果一致,无法解决幻读。事务读取范围性记录,另外一个事务写入记录,事务再读时多了新写的记录,记录称为幻行,现象称为幻读。InnoDB 通过 MVCC 解决了幻读的问题。可重复读是 MySQL 默认的事务隔离级别。
  • 可串行化(SERIALIZABLE):最高隔离级别,通过强制事务串行执行,避免前面的幻读问题。

1.3.3 死锁

  • InnoDB 处理死锁方法:持有较少行级排他锁事务回滚。

1.3.4 事务日志

  • 提高数据持久性。
  • MySQL 数据修改过程:修改内存拷贝,事务修改行为持久化到事务日志中(顺序 IO),内存修改后台刷回磁盘。两次磁盘写操作。

1.3.5 MySQL 中的事务

  • 两种事务性存储引擎::InnoDB、NDB Cluster
  • 自动提交(AUTOCOMMIT):MySQL 默认,每个查询都是一个事务,设置 AUTOCOMMIT 来启用或禁用,仅限于当前连接。sql:set autocommit = 1 1 开,0 关。autocommit=0 时,所有查询都在一个事务中,直到显式执行 commit 或者 rollback,事务结束,开启一个新的事务。
  • alter table、lock tables 等会导致大量数据变更的命令,执行之前会强制 commit 当前事务。
  • MySQL 通过 set transaction isolation level read committed 来设置隔离级别,下一个事务开始生效,也可以在配置文件中修改。修改会话级隔离级别:set session transaction islation level read committed(多了个 session)。
  • 事务中同时使用事务型存储引擎和非事务存储引擎的表,在回滚时非事务存储引擎的表无法回滚,会导致数据库处于不一致状态。
  • 隐式、显式锁定:InnoDB 采用两阶段锁定协议,InnoDB 根据隔离级别自动加锁 为 隐式锁定,sql 语句 select … lock in share mode, select … for update 为 显示锁定。锁只有在 commit 或者 rollback 的时候才会释放。