Hibernate 自动提交

碰到一个同事没有用@Transactional声明事务,数据库还是提交了。感觉奇怪,测试验证了一下,记录一下

代码:
    @Transactional
    public void addSe() {
        Se se = new Se();
        se.setName("test");
        commonDao.getHibernateTemplate().save(se);

        String a = null;
        a.length(); //抛异常
        Se se1 = new Se();
        se1.setName("test111");
        commonDao.getHibernateTemplate().save(se1);
    }
配置:
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
  <property name="url" value="jdbc:oracle:thin:@1.1.1.1:1521:a" />
  <property name="username" value="a" />
  <property name="password" value="1" />
 </bean>

 <tx:annotation-driven transaction-manager="transactionManager" />

 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
  <property name="dataSource" ref="dataSource" />
 </bean>

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.connection.autocommit">false</prop>
    <prop key="hibernate.cache.use_second_level_cache">false</prop>
    <prop key="hibernate.cache.use_query_cache">false</prop>
   </props>
  </property>
  <property name="packagesToScan">
   <list>
    <value>cn.test</value>
   </list>
  </property>
 </bean>
 
加 @Transactional 的情况下,由于回滚,两条记录都没有写进数据库 ,即有事务并回滚
去掉@Transactional后,第一条记录入库,第二条没有入库;即两次操作不在一个事务中,但第一个操作的操作自动提交了

跟踪了一下connection的atuoCommit,刚被创建时atuoCommit为true,
如果配置了@Transactional ,org.hibernate.transaction.JDBCTransaction在事务开始时将自动提交设置为false ;
事务结束或者回滚后再设置为原始的状态。
public void begin() throws HibernateException {
  if (begun) {
   return;
  }
  if (commitFailed) {
   throw new TransactionException("cannot re-start transaction after failed commit");
  }


  log.debug("begin");

  try {
   toggleAutoCommit = jdbcContext.connection().getAutoCommit();
   if ( log.isDebugEnabled() ) {
    log.debug("current autocommit status: " + toggleAutoCommit);
   }
   if (toggleAutoCommit) {
    log.debug("disabling autocommit");
    jdbcContext.connection().setAutoCommit(false);
   }
  }
  
不过<prop key="hibernate.connection.autocommit">false</prop> 好像不起作用;
查了一下代码,hibernate.connection.autocommit在DriverManagerConnectionProvider创建连接的时候用到,
但这个执行过程没有用到DriverManagerConnectionProvider,根据配置是org.springframework.jdbc.datasource.DriverManagerDataSource完成创建连接的动作
不清楚是否还有其他地方用到了这个配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值