最近研究了很久spring控制事务的问题,也看了源代码,但是小弟有一点问题不明白
在事务方法中如
public void update()
{
//dataStore.currentConnection().setAutoCommit(false);
Student stu =new Student();
stu.setId("3");
stu.setName("潘潘");
dataStore.insert(stu);}这样是没有问题的,可以插入oracle数据库中,如果把注释打开则无法插入到数据库中,但是控制台仍然能看到插入的sql语句,autocommit true/false只是设置是否自动提交的意思,但是spring声明式事务在方法结束后会自动调用事务提交,但是就没有入库,不知道为什么,源码commit如下
txObject.getSessionHolder().getTransaction().commit();
又做一个测试,我如果做个断点
public void update()
{
dataStore.currentConnection().setAutoCommit(false);
Student stu =new Student();
stu.setId("3");
stu.setName("潘潘");
dataStore.insert(stu);
dataStore.currentSession().beginTransaction().commit();
}
这时当执行dataStore.currentSession().beginTransaction().commit()后,会立刻插入到oracle库中
现在不明白这两个测试,为什么一个可以插入,一个不能插入,还忘请教

解决方案 »

  1.   

    声明式事务要配置切面 事务管理器 交给spring管理事务 不需要你commit
      

  2.   

    首先,spring的提交数据库的方式是在一个事务内所有的操作结束没有异常的情况下自动向数据库同步。
    其次,如果你设置dataStore.currentConnection().setAutoCommit(false); 说明不让spring自动和数据库的数据同步(同步操作包括CRUD),所以当方法执行完成后数据库的数据并不更新。
    再次,当你dataStore.currentConnection().setAutoCommit(false)后,然后dataStore.currentSession().beginTransaction().commit(); 表明你是手动和数据库的数据保持同步,所以数据库的数据会做更新操作。
      

  3.   

    楼上的,但是我看spring事务源代码,方法存在于事务内,在方法结束以后会调用docommit()这个方法
    也就是整个事务会提交,源码是txObject.getSessionHolder().getTransaction().commit();这时数据应该会更新到数据库啊,autocommit的作用不就是是否设置自动提交的意思吗,方法结束后也就相当于aop给我们做了事务提交了,应该与我上面在事务方法中手动调用的情况dataStore.currentSession().beginTransaction().commit(); 是一样的吧,谢谢