这个问题其实早就有了, 不过很懒 一直都没搞, 这次有个新项目, 刚好又学了点springjunit测试, 发现了一点问题, 也对以往的疑惑做了一些测试
SPRING 声明式XML事务和注解式事务, 哪个优先级更高?
几个关键代码, 其他省略
<aop:advisor id="managerTx" advice-ref="txAdvice" pointcut="execution(* *..service.*Manager.*(..))" order="2"/>
<tx:advice id="txAdvice">
<tx:attributes>
<!--tx:method name="get*" read-only="true"/-->
<tx:method name="test*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
@Override
@Transactional(readOnly = false)
public void saveRole() {//这是manager代码
Role role = new Role("role1");
role = roleDao.save(role);
if (role.getId() != null)
throw new RuntimeException("error");
role = new Role("role2");
role = roleDao.save(role);
}
@Test
public void testSaveRole() {//这是junit test代码
roleManager.saveRole();
}
spring有2种方式声明事务
1 XML文件
2 注解
测试1 XML里设置 read-only="true", 注解 read-only="false" 执行出错 看来是XML优先级高
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
测试2 XML里设置 read-only="false", 注解 read-only="true" 执行成功 看来还是XML优先级高
测试3 XML里不设置 注解 read-only="true" 执行出错
不过和有的人得出的结论相悖 http://www.iteye.com/problems/10112
本人 spring 版本 3.0.6
不知道有没有人做类似测试.
还有一个问题, 就是junit 事务的问题
@Test
public void testSaveRole() {
roleManager.saveRole();//此方法里的事务可以回滚
}
@Test
public void testSaveRole() {//但是这样写, 事务就不回滚
Role role = new Role("role1");
role = roleDao.save(role);
if (role.getId() != null)
throw new RuntimeException("error");
role = new Role("role2");
role = roleDao.save(role);
}
不知道是什么原因.