-
ACID
- 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元
- 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态
- 隔离性(isolation):一个事务所做的修改在最终提交前,对其他事务都是不可见的
- 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中(记录一个昨天看到的:MySQL对数据库的操作,只是修改其内存拷贝,然后将修改行为记录到持久在硬盘上的事务日志-(采用追加的形式)中,然后在后台慢慢地刷回到磁盘中)
-
在事务中使用混合引擎
例如:在事务中混合使用事务型引擎(InnoDB)的表和非事务型引擎(MyISAM)的表
会出现的问题:当事务需要回滚的时候,使用非事务引擎的表的数据无法回滚
-
InnoDB 上锁
- 隐式锁定:只有在COMMIT和ROLLBACK的时候才会释放,常用的一般都是属于这一类型
- 显式锁定:不属于SQL规范
- SELECT ... LOCK IN SHARE MODE
- SELECT ... FOR UPDATE
- MySQL还支持 LOCK TABLES 和 UNLOCK TABLES(跟引擎无关,在服务器层实现)(会导致变复杂。一般不推荐使用)
-
MVCC 多版本并发控制(只在 REPEATABLE READ 和 READ COMMITTED 两个隔离级别下工作)
- 例子:InnoDB 的 MVCC 【保存两个额外系统版本号,使大部分的读操作不需要加锁-使读数据的操作变得简单并且性能消耗较小】
- SELECT【只有符合下面两个条件的结果才会被返回】
- InnoDB只查找版本早于当前事务版本的数据行【这样确保了 这些行要么在事务开始之前就已经存在,或者在事务进行的过程中插入或者修改的】
- 行的删除版本要么未定义,要么大于当前事务的版本号【这样确保了事务读取到的行,在事务开始之前未被删除】
- INSERT
- InnoDB 为新插入的每一行保存当前系统版本号作为行版本号
- DELETE
- InnoDB 为删除的每一行保存当前系统版本号作为行删除标志
- UPDATE
- InnoDB 为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标志
- SELECT【只有符合下面两个条件的结果才会被返回】
- 例子:InnoDB 的 MVCC 【保存两个额外系统版本号,使大部分的读操作不需要加锁-使读数据的操作变得简单并且性能消耗较小】