java-Spring何时不应该提交? (与Oracle自动提交有关)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-Spring何时不应该提交? (与Oracle自动提交有关),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1817字,纯文字阅读大概需要3分钟。
内容图文
![java-Spring何时不应该提交? (与Oracle自动提交有关)](/upload/InfoBanner/zyjiaocheng/883/5164e27ebe6242e4946dea6d57f07d53.jpg)
我有一个像下面的界面
public interface FooDAO {
public void callA(String x);
}
以及以下实现故意将只读设置为true且不受支持
public class FooDAOImpl implements FooDAO {
//for testing
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public void callA(String x) {
//sql update method
}
}
在我的春季环境中,我声明了数据源事务管理器和tx:annotation驱动的.我写了一个Junit4测试,看起来像
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@TransactionConfiguration(transactionManager="txManager", defaultRollback=true)
public class MyTest {
@Resource
FooDAO fooDAO;
@Test
public void testRegisterWorker() {
fooDAO.callA("")
}
}
我希望该记录根本不会插入数据库中.但是,我看到该行实际上已插入到数据库中.我确实使用了Oracle数据库,因此我认为默认情况下自动提交设置为true(我认为).但是spring事务标记不应该覆盖它们吗?
有人可以告诉我这里出了什么问题吗?
解决方法:
默认情况下,自动提交可能处于打开状态.使用DataSourceTransactionManager,仅在实际启动事务时才更改自动提交. NOT_SUPPORTED或SUPPORTS都不会启动事务,因此无论连接处于哪种默认状态都将保留.
考虑在Spring xml文件中默认情况下将自动提交设置为关闭.如果启用了该功能,Spring将必须在每次发送之前进行更改,然后再进行恢复,这在Oracle中可能是昂贵的(不确定).这也可以防止您意外地在事务外部进行提交.
有关详细信息,请参阅org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(),它管理Connection的自动完成和隔离级别.如果传播是必需的,REQUIRES_NEW或PROPAGATION_NESTED,则仅由AbstractPlatformTransactionManager.getTransaction()和handleExistingTransaction()调用doBegin().
您可能想看一下org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests.这是一个Spring感知的基类,可以用于测试类.它将在每个测试用例结束时回滚所有事务.这样一来,就无需为了测试而更改批注.您可以将@Transactional设置为应采用的方式,并依靠回滚来确保在测试期间db中实际上没有任何更改.
内容总结
以上是互联网集市为您收集整理的java-Spring何时不应该提交? (与Oracle自动提交有关)全部内容,希望文章能够帮你解决java-Spring何时不应该提交? (与Oracle自动提交有关)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。