8000"whereid=1;
4.Connectioncon2=getConnection();
5.select*fromemployeeswhereid=1; //此时查询结果为8000,Mary的工资被未提交的事务影响,产生脏读
ISOLATION_READ_COMMITTED在这种隔离级别下,一个事务只能看见已经提交的事务对数据库的修改,不能看到未提交的事务修改。这可以防止脏读,但是不可重复读和幻像读仍然可能发生。
例如:
Mary的工资被财务人员改为8000并提交。
Tom在Mary的工资更新后立即查询,得到8000。
财务人员发现错误,将Mary的工资改为5000并提交。
Tom再次查询,得到5000,两次查询结果不同,产生不可重复读。
ISOLATION_REPEATABLE_READ这是MySQL的默认隔离级别,它可以防止脏读和不可重复读,但在某些情况下仍可能产生幻像读。在这个级别,一个事务在整个事务期间可以看到相同的数据集,即使其他事务在此期间对数据进行了修改。
例如:
财务人员在数据库中设置了两个相同条件的查询(如:查找所有工资高于5000的员工),在第一次查询时有10个员工满足条件,然后另一个事务插入了一个新员工,工资也为5000。当财务人员再次执行相同查询时,得到了11个结果,产生了幻像读。
ISOLATION_SERIALIZABLE这是最高的事务隔离级别,可以防止脏读、不可重复读和幻像读。在串行化级别,事务会按照顺序进行,如同在单线程环境中执行,这样可以完全避免并发问题,但代价是性能降低,因为事务之间需要等待。
getPropagationBehavior()方法返回事务的传播行为,定义了在一个事务方法被调用时,如何与当前运行的事务进行交互。Spring提供了七种事务传播行为:
1. PROPAGATION_REQUIRED这是默认的传播行为,如果当前存在事务,则加入到该事务;如果当前没有事务,则新建一个事务。
2. PROPAGATION_SUPPORTS如果当前存在事务,则支持事务;如果当前没有事务,则不开启新的事务。
3. PROPAGATION_MANDATORY如果当前存在事务,则加入到该事务;如果当前没有事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW新建一个事务,如果当前存在事务,则把当前事务挂起。
5. PROPAGATION_NOT_SUPPORTED永不支持事务,如果当前存在事务,则把当前事务挂起。
6. PROPAGATION_NEVER永不支持事务,如果当前存在事务,则抛出异常。
7. PROPAGATION_NEST