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. 这样避免了脏数据的出现,也合乎了事务的特征。。不知道能不能看明白
在一个业务中中,你有多个操作数据库的子业务,
例如
业务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如果connection.autocommit=true,每次‘直接’和database数据库连接,没有经过缓存了,是不是缓存的利用率下降啦?
2另外,autocommit=true以后,代码中的‘显式声明’的事务是不是不能起作用了?
2另外,autocommit=true以后,代码中的‘显式声明’的事务是不是不能起作用了?
1,和缓存没关系,当整合spring时,ORM一般都是hinernate,缓存级别都是在hibernate的xml文件中设置的,一级缓存session,2级缓存sessionFactory,如果不是用orm,纯JDBC的话,缓存级别只能在数据库端设置。所以与connection.autocommit= true无关。2,显式声明,你是说在程序中设置
connection.setautocommit(false);
然后通过调用connection类的commit()与rollback()方法来人工的方式对事务进行管理?
如果是这样的话,你的事务时起作用的。
无论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.
楼下可以继续讨论.
呵呵!
Mead