恳请指点!
简单的hibernate事务往数据库存数据,但是save()后(事务未commit之前)数据库就已经有数据,出现异常后事务也不回滚,mysql数据库,数据库事务隔离级别默认:不可重复读
保存User方法        @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方法
@Override
public void addLog(Log log) {

HibernateUtil.getSessionFactory().getCurrentSession().save(log);

}hibernate配置文件<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()也会执行,但是事务却没回滚。
恳请指点!

解决方案 »

  1.   

    你MySQL建表的时候,选择的是什么类型的表?MySQL不是所有表类型都支持事务的。建议你使用: InnoDB
      

  2.   

    建表也是用的hibernate导出的表结构Configuration config = new Configuration().configure(); SchemaExport schema = new SchemaExport(config); schema.create(true, true);
      

  3.   

    去MySQL控制台去查一查,这里看不出来的。
      

  4.   

    帮你Google了下,基本上应该是我的判断了,Hibernate缺省建表是MyISAM类型。参考这里的建议做修改吧:
      http://www.micmiu.com/j2ee/spring/spring-transaction-mysql/
      

  5.   

    本身是没有问题的,
    楼主加上finally {session.close();}
    试一下,session关闭一下。
      

  6.   

    因为用了获取当前session,所以不需要关闭session,
    不过问题解决了,就是2楼这位哥们儿的答案