Wiky's Blog

MySQL事务隔离级别及脏读及不可重复读和幻读的理解

##事务
事务:一组原子性的SQL语句;要么全部执行,要么全部不执行(中途语句出现错误会回滚);
一个运行良好的事务处理系统要遵循CAID原则:
C(consistency)一致性:数据库会从一个一致性状态转换成另一个一致性状态;
A(atomicity)原子性:事务是一个最小的不可分割的单元,要么全部执行要么全部不执行;
I(isolation)隔离性:一个事务所做的修改未提交之前,其他事务不可见;
D(durability)持久性:一个事务所做的修改,会永久保存到数据库中。

###隔离性=》隔离级别
SQL标准里面定义了四种隔离级别:
1.READ UNCOMMIT(未提交可读):该事物未提交的修改可以在其他事务可见;
产生脏读:读取到了未提交的数据;
2.READ COMMIT(提交可读):一个事务开始时,只能看见已经提交的修改;
虚读:两次查询会因为其他事务修改了表中的数据而变得结果不一致的情况,也叫不可重复读;
3.REPEATABLE READ(可重复读):保证同一事务读取同样的记录结果是一致的;
无法避免幻读:当前事务读取某个范围的记录时,另一个事务在该范围内插入了新的记录,当前事务再次读取该范围的记录时,会产生幻行;
4.SERILIZABLE(可串行化):强制事务串行执行;

###死锁
出现的原因:
一个事务更新第x行(行锁产生)及第y行数据,另一个事务更新第y行(行锁产生)数据及第x行数据,两个事务都会因为等待锁的释放而产生死锁。

注:事务回滚涉及到不支持事务的引擎创建的表的语句时,不会回滚其语句,也不会给出提示。

###隐式锁显示锁
InnoDB引擎采用两个阶段锁定协议;锁早事务COMMIT和ROLLBACK之后才会释放。
INNoDB也支持显式加锁:LOCK IN SHARE MODE;

##多版本并发(complicated)控制MVCC:
一般会实现非阻塞的读以及写操作只锁定必要的行;分乐观和悲观并发控制;
InNoDB的MVVC实现P12:增加额外的两个行;
数据库引擎考虑的因素:
1.事务:需要事务支持选择InNoDB;不需要事务,主要是INSERT和SELECT操作,选择MyIASM;
2.备份:在线热备份,选择InNoDB;
3.崩溃恢复:首选InNoDB;4.其他特性:

###日志型应用
对插入的要求较高,选择MyISAM比较合适;

热评文章