1.概念复习
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
脏读:一个事务读到另一个事务未提交的更新数据。
幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样。
不可重复读:比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。
2.Spring支持的隔离级别
Spring支持五种事务隔离级别:
DEFAULT:使用数据库本身使用的隔离级别 ORACLE(读已提交) MySQL(可重复读)
READ_UNCOMITTED:读未提交(脏读)最低的隔离级别,一切皆有可能。
READ_COMMITED:读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。
REPEATABLE_READ:可重复读,解决不可重复读的隔离级别,但还是有幻读风险。
SERIALIZABLE:串行化,最高隔离级别,杜绝一切隐患,缺点是效率低。
3.Spring设置事务隔离级别
用@Transactional 注解声明式地管理事务时可以在 @Transactional 的 isolation 属性中设置隔离级别:
在 Spring 2.x 事务通知中, 可以在 <tx:method> 元素中指定隔离级别:
但是啊,Spring建议的是使用DEFAULT,就是数据库本身的隔离级别,配置好数据库本身的隔离级别,无论在哪个框架中读写数据都不用操心了。而且万一Spring没有把这几种隔离级别实现的很完善,出了问题就难办啦。