`
zhoujinhuang
  • 浏览: 93456 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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完成创建连接的动作
不清楚是否还有其他地方用到了这个配置

分享到:
评论
1 楼 zongzhankui 2012-12-15  
http://www.cnblogs.com/kevin-yuan/archive/2012/09/19/2693153.html

相关推荐

    Spring+Hibernate 自动映射

    2. **事务管理(Transaction Management)**:Spring提供了声明式事务管理,开发者只需在方法上添加@Transactional注解,Spring就会自动处理事务的开始、提交或回滚,提高了代码的可读性和可维护性。 3. **数据源...

    Struts2.1.6+Spring2.5.6+Hibernate3.3.1框架整合常见错误

    此配置会导致Hibernate自动提交事务,对于某些数据库(如SQL Server)来说,在某些情况下可能会导致问题,比如无法查询数据库或执行特定的SQL语句。 **解决方法**: 1. **设置自动提交为false**: 将`connection....

    如何解决hibernate自动更新实体类的问题共5页.pd

    在使用Hibernate进行Java开发时,有时会遇到一个常见的问题,即Hibernate自动更新实体类的问题。这个问题通常发生在我们从数据库加载一个实体对象,对其进行修改,但并没有显式地调用`save()`或`update()`方法,然而...

    Hibernate事务(源码)

    编程式事务管理通常在代码中显式地开启、提交和回滚事务,而声明式事务管理则依赖于如Spring框架这样的容器,通过AOP(面向切面编程)自动管理事务边界。 ### 3. 事务隔离级别 根据数据库系统的不同,Hibernate...

    使用hibernate做的一个登录的小实例,代码大部分都是自动生成

    通过这个项目,我们可以学习到Hibernate的基本使用方法,包括实体类的创建、持久化配置、数据库交互以及自动生成的映射文件等内容。这个实例特别适合对ORM框架感兴趣,希望学习Hibernate的开发者。 【知识点详解】...

    如何解决hibernate自动更新实体类的问题共5页.pdf.zip

    1. **显式控制更新**:如果你不想让Hibernate自动更新实体,可以在修改完对象后,调用`Session.evict(entity)`方法将实体从Session缓存中移除,这样就不会触发自动更新。或者,如果不希望整个实体被更新,可以只更新...

    hibernate3 hibernate3

    Hibernate支持多种主键策略,如自动生成(GenerationType.AUTO)、固定值(GenerationType.IDENTITY)等。 4. Session:它是Hibernate的主要工作单元,用于在应用程序和数据库之间建立会话。Session提供了一种透明...

    使用代理实现Hibernate Dao层自动事务

    本文将深入探讨如何使用代理来实现Hibernate Dao层的自动事务管理,以提高代码的可维护性和事务处理的效率。 首先,理解Dao(Data Access Object)层的作用至关重要。Dao层是应用与数据库之间的一层抽象,它封装了...

    hibernate根据字段生成数据库表

    Hibernate 提供了一个非常实用的功能——基于实体类自动生成数据库表,这不仅能够显著提高开发效率,还能减少人为错误。本文将详细介绍如何利用 Hibernate 的 `SchemaExport` 类实现这一功能。 #### 二、准备工作 ...

    SpringAOP整合Hibernate并使用事务

    AOP代理可以在方法调用前后自动执行事务相关的操作,如开启、提交、回滚事务,大大提高了代码的整洁度。 3. **整合Spring与Hibernate** 整合Spring和Hibernate主要涉及以下步骤: - 引入依赖:确保项目中包含了...

    Spring通过AOP实现Hibernate自动事务.rar

    本教程将详细介绍如何在Spring框架中利用AOP实现对Hibernate的自动事务管理,以便于提升开发效率和代码的可维护性。 首先,理解Spring AOP的核心概念。AOP允许程序员定义"切面",这些切面可以包含业务逻辑的各个...

    Hibernate学习笔记整理

    2. 在 Hibernate 中事务不是自动提交的 Hibernate 的入门操作 1. 创建一个 Java 项目 2. 准备 jar 包 3. 创建 Hibernate 的配置文件 4. 创建 Hibernate 的持久化类 5. 创建映射文件 Configuration 类 * 利用该类...

    Could not roll back Hibernate transaction.doc

    Hibernate的事务管理机制可以自动管理事务的提交和回滚,确保数据库的一致性和完整性。 五、Hibernate事务回滚机制 Hibernate的事务回滚机制是指在事务执行过程中,遇到错误或异常时,Hibernate可以自动回滚事务,...

    深入浅出 Hibernate.pdf

    具体来说,当一个Java对象被持久化到数据库时,Hibernate会自动执行必要的SQL语句来插入或更新数据库中的记录;当从数据库加载对象时,Hibernate则会根据查询结果构建相应的Java对象实例。 ### Hibernate的优势 1....

    Hibernate教程26_事务并发处理

    在Hibernate中,可以使用`@Version`注解来自动管理乐观锁。s2sh_relation26_optimistic_Lock.zip可能包含了一个示例,演示了如何在实体类中定义版本字段,并在Service或DAO中处理乐观锁的逻辑。 学习这两个锁机制...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - **Transaction**: 事务处理接口,用于管理数据库事务的开始、提交和回滚。 **2. Hibernate配置** - **hibernate.cfg.xml**: Hibernate的主要配置文件,包含了数据库连接信息、方言设置等。 - **实体类注解**: ...

    Hibernate4实战 之第五部分:Hibernate的事务和并发

    - **扩展周期的 Session 和自动版本化**:Hibernate 使用扩展周期的 Session 来提供自动版本检查,可以在同步时检测并发修改并抛出异常。这种方式更为高效,减轻了开发者的负担。 #### 七、总结 Hibernate 的事务...

    springMvc+hibernate Demo

    2. **事务管理**:Spring 提供了事务管理服务,可以在 Controller 中声明事务边界,由 Spring 自动处理事务的提交和回滚。 3. **依赖注入**:Spring 可以通过依赖注入(DI)将 DAO 注入到 Service 层,Service 再...

    Hibernate实战(入门篇)

    6. **数据库表的自动创建**:使用`hbm2ddl`工具类,可以通过Hibernate自动根据实体类生成数据库表。这样,无需手动编写SQL创建表,提高了开发效率。 7. **数据库操作**:在数据库层面,你需要先创建数据库,然后...

Global site tag (gtag.js) - Google Analytics