connection.autocommit=true这个属性是说,如果是true的话,就是自动提交,比如
在一个业务中中,你有多个操作数据库的子业务,
例如
业务SuperA中有子业务suba,subb,subc.....
如果是自动的话,
suba操作成功 提交
subb操作失败 回滚
subc操作失败 回滚按照我们的逻辑当SuperA中有某一环节操作失败的话,都应该回滚到没有操作之前
而当为true时,则为出现a成功 b,c失败 ,SuperA不具备了时务的特征,原子性等等当不是true时,这时事务的管理提交给了spring,Spring的事务控制是以一个bean为单位的,
SuperA是bean中一个方法或者其他,这样当执行事务SuperA时,只要a,b,c...中一个失败,都
会认定是失败操作 roolback. 这样避免了脏数据的出现,也合乎了事务的特征。。不知道能不能看明白

解决方案 »

  1.   

    恩,非常感谢!这样设置不利于事务操作,这个明白了!
    1如果connection.autocommit=true,每次‘直接’和database数据库连接,没有经过缓存了,是不是缓存的利用率下降啦?
    2另外,autocommit=true以后,代码中的‘显式声明’的事务是不是不能起作用了?
      

  2.   

    1如果connection.autocommit=true,每次‘直接’和database数据库连接,没有经过缓存了,是不是缓存的利用率下降啦? 
    2另外,autocommit=true以后,代码中的‘显式声明’的事务是不是不能起作用了?
    1,和缓存没关系,当整合spring时,ORM一般都是hinernate,缓存级别都是在hibernate的xml文件中设置的,一级缓存session,2级缓存sessionFactory,如果不是用orm,纯JDBC的话,缓存级别只能在数据库端设置。所以与connection.autocommit= true无关。2,显式声明,你是说在程序中设置
       connection.setautocommit(false); 
       然后通过调用connection类的commit()与rollback()方法来人工的方式对事务进行管理?
       如果是这样的话,你的事务时起作用的。 
      

  3.   

    这个问题很有讨论的价值
    无论connection.autocommit=true还是connection.autocommit=false 无论是声明式事务还是编程式事务都是有效的(即SuperA方法中的suba方法成功,subb方法失败,是会回滚掉suba的)
    这个只是设置conn默认值而已.我不知道为什么不建议使用true.官方有说明吗?
    但是我分别说说使用true和不使用true的问题
    (一)如果默认为true
    1.保存对象是不需要开事务的,读写随意.
    2.session.flush()是有意义的,因为session.flush()的操作是可以生效的.
    (二)如果默认值为false
    1.保存对象必须使用事务,不管是声明式事务还是编程式事务.当然也可以采用重置autocommit的方式
    2.session.flush()是在事务块里面是没有意义的,因为数据操作是要统一提交的,但是这里我并没用经过复杂的测试,稍后有时间我再尝试几种情况.
    3.如果不在事务块内修改持久化对象后执行session.flush(),数据库会锁表.总结:
    session的autocommit模式也是可以修改的,所以默认为false,在复杂的情况下需要手工控制flush时可以修改autocommit疑惑:
    查阅了spring的源码,在使用spring的声明式事务时,会修改session的FlushMode为AUTO,很不解,查阅JDBCTransaction类的commit方法
    if ( !transactionContext.isFlushModeNever() && callback ) {
    transactionContext.managedFlush(); //if an exception occurs during flush, user must call rollback()
    }
    实际上当FlushMode为MANUAL或NEVER时,提交的时候会通过managedFlush()遍历所有的session的flush方法,不知道在事务块里面spring为什么要修改FlushMode为AUTO,当事务结束时又会改回原有的mode.
    楼下可以继续讨论.
      

  4.   

    呵呵,全部疑惑都已经解开,包括spring为什么在事务块设置为AUTO,flush()在事务块中也是十分有意义的,尽管commit时候是统一提交但是,hibernate是会记录逻辑顺序,而且在事务块中设置AUTO是十分严谨的.因为NEVER时commit会进行智能判断等等,看完奥运后我会在博客中进行总结.
      

  5.   

    非常感谢!sunyujia
    呵呵!
    Mead