日期:2014-05-17  浏览次数:20642 次

求指点,hibernate事务不起作用
恳请指点!
简单的hibernate事务往数据库存数据,但是save()后(事务未commit之前)数据库就已经有数据,出现异常后事务也不回滚,mysql数据库,数据库事务隔离级别默认:不可重复读
保存User方法
Java code

        @Override
    public void addUser(User user) {
        
        Session session = null;
        Transaction trans = null;
        try {
            session = HibernateUtil.getSessionFactory().getCurrentSession();
            trans = session.beginTransaction();
            //保存用户
            session.save(user);
            //制造异常
            System.out.println(1/0);
            //记录日志
            LogMgr logMgr = new LogMgrImpl();
            Log log = new Log();
            log.setOperationTime(new Date());
            log.setDetail("保存用户");
            log.setUserName(user.getName());
            
            logMgr.addLog(log);
            trans.commit();
        } catch (Exception e) {
            e.printStackTrace();
            trans.rollback();
            // TODO: handle exception
        }
        
    }


保存Log方法
Java code
@Override
    public void addLog(Log log) {
        
        HibernateUtil.getSessionFactory().getCurrentSession().save(log);
        
    }


hibernate配置文件
XML code

<session-factory>
        <property name="hibernate.dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="hibernate.connection.url">
            jdbc:mysql://localhost/SSH2?characterEncoding=UTF-8
        </property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">admin</property>
        <property name="hibernate.connection.driver_class">
            com.mysql.jdbc.Driver
        </property>

        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <property name="hibernate.current_session_context_class">thread</property>
        
        <mapping resource="com/spg/bean/User.hbm.xml" />
        <mapping resource="com/spg/bean/Log.hbm.xml" />

    </session-factory>


运行时手动制造的异常会抛出,rollback()也会执行,但是事务却没回滚。
恳请指点!

------解决方案--------------------
你MySQL建表的时候,选择的是什么类型的表?MySQL不是所有表类型都支持事务的。

建议你使用: InnoDB
------解决方案--------------------
本身是没有问题的,
楼主加上finally {session.close();}
试一下,session关闭一下。