概述
继续说一下数据库的原理性基础——事务隔离级别。
事务隔离级别说的是并行执行的多个事务之间的关系,另外一个原理性基础——事务传播属性,这个概念说的是存在包含管理的多个事务之间的关系(这个概念应该是在代码层面的,而不是数据库层面的,比如常说的spring事务传播属性)。
事务隔离级别
四种级别:
关键字 | 隔离级别 |
---|---|
read uncommitted | 不提交读(其他事务未提交的修改可以读取到) |
read committed | 提交读(其他事务的修改只有当事务提交后才可以读取到) |
repeatable read | 可重复读 |
serializable | 串行化 |
四种级别的影响
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 |
---|---|---|---|
read uncommitted | Y | Y | Y |
read committed | N | Y | Y |
repeatable read | N | N | Y |
serializable | N | N | N |
说一下三种读取问题:
脏读是读取到了另外一个事务未提交的修改,但是该修改最终被回滚取消了。
不可重复读是第一次读取到了一的数据,在第二次读取时被另一个事务修改了,也就是两次读取到数据不一样。
幻读是第二次读取到的数据比第一次读取到的数据多的某些行,也就是在两次读取之间其他的事务进行了插入新行的操作,出现了幻影行。
虽然,上表是《高性能MySQL》给出的,错误是没有。但是要注意,这里给出的是“可能性”,对于InnoDB来说在默认的repeatable read隔离级别是通过多版本并发控制实现了避免幻读功能的。也就是说对于常用的InnoDB引擎来说repeatable read隔离级别完全避免的脏读、不可重复读和幻读的。
隔离级别的修改
1.全局修改
修改mysql.ini配置文件,在最后加上:
[mysqld]
transaction-isolation = REPEATABLE-READ
2.在控制台输入:set session transaction isolation level repeatable read;
3.在应用层面的连接池处修改
dbcp连接池属性:
推荐文章
1.下面这篇文章截取了《高性能MySQL》里面的描述,另外添加了蛤蜊级别的修改方法:http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html;
2.下面这篇说道了事务隔离级别和锁机制(隔离级别也是借用的《高性能MySQL》内容):http://www.cnblogs.com/wenfeng762/archive/2011/11/06/2237253.html