1.3. 事务

未匹配的标注

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的时候才会释放。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
canaan_wang
讨论数量: 0
发起讨论 只看当前版本


暂无话题~