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