上一篇博客《Spring Transaction属性之Propagation》讲解了Propagation相关的知识,这篇博客主要关注于Isolation这个属性。
一、Isolation基础
请先移步Wikipedia:isolation.
Isolation Level VS Phenomena

上图来自wikipeida。
因为我们在申明Isolation Level时,我们仅仅关心什么Phenomena不会出现。所以,在SQL标准中,仅仅规定了Isolation Level会保证哪种读现象不会出现,而不会规定某种读现象一定会出现。
例如,在Isolation设置为Repeatable Read时,不会出现Dirty Read。但是可能< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPrvhs/bP1lBoYW50b21zoaPI59TaUG9zdGdyZXPW0KOsUmVwZWF0YWJsZSBSZWFktcTQp7n7vs21yM2s09pTZXJpYWxpemFibGWjrLb41NrG5Mv7tcTK/b7dv+KjrMjnREIy1tCjrFJlcGVhdGFibGUgUmVhZLvhs/bP1lBoYW50b20KIFJlYWShozwvcD4KPHA+PGJyPgo8L3A+CjxwPrb+oaJJc29sYXRpb27A/dfTPC9wPgo8cD5Jc29sYXRpb26xvsntx7DD5rXEd2lraXBlZGlhtcTBtL3T0tG+rb2ytcS63Mfls/7By6Os1eLA787Sw8fTw1NwcmluZyBUcmFuc2FjdGlvbsC01tjP1tK7uPZQaGFudG9tIFJlYWS1xMfpv/aho7TzvNK40Mrc0rvPwr7N0NDBy6GjPC9wPgo8cD682cnoztLDx9PQ0rvVxbHtvdBVc2Vyo6xVc2VytcRpZMrH1ve8/KGjVXNlclNlcnZpY2XM4bmpwcvI58/Cwb249re9t6ijujwvcD4KPHA+PGJyPgo8L3A+CjxwPiAgICBAVHJhbnNhY3Rpb25hbChpc29sYXRpb24gPSBJc29sYXRpb24uUkVBRF9DT01NSVRURUQpPGJyPgogICAgcHVibGljIHZvaWQgaW5zZXJ0RGF0YSgpIHs8YnI+CiAgICAgICAgamRiY1RlbXBsYXRlLnVwZGF0ZSg="insert into User (id, username, age) values (123, 'xxx', 19)");
doSleep(20000);
}
@Transactional(isolation = Isolation.READ_COMMITTED)
public void readRange() {
System.out.println(jdbcTemplate.queryForList("select * from User where uses > 18").size());
doSleep(40000);
System.out.println(jdbcTemplate.queryForList("select * from User where uses > 18").size());
}
如果我们同时执行这两个方法:那么insertData中的SQL会在两次Query之间执行,于是readRange的两次结果就会相差一。如果将READ_COMMITTED改为了REPEATABLE_READ,则两次结果会相同。
问题:如果我们的两个方法的Transaction Isolation声明不同,我们应该“听”哪一个的呢?如上面的例子,我们把任意一个改成SERIALIZABLE后,会出现什么样的结果呢?
三、Isolation加强版
下面是何登成的博客,有些关于加锁与Isolation之间关系的分析,很值得一读:
http://hedengcheng.com/ p=771
四、Isolation的实现
常见的实现包括加锁和MVCC(Multi Version Consistency Control),更多的参考资料,移步:
http://coolshell.cn/articles/6790.html
http://en.wikipedia.org/wiki/Multiversion_concurrency_control
http://wiki.postgresql.org/wiki/Serializable