Java 为什么即使存在';这不涉及交易吗?
我们都知道,在Hibernate中,如果没有事务提交,更改将不会影响数据库。但我发现了一些奇怪的东西。守则如下:Java 为什么即使存在';这不涉及交易吗?,java,hibernate,Java,Hibernate,我们都知道,在Hibernate中,如果没有事务提交,更改将不会影响数据库。但我发现了一些奇怪的东西。守则如下: ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml"); SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory"); Session session = sessionFacto
ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
SessionFactory sessionFactory = (SessionFactory) ctx.getBean("sessionFactory");
Session session = sessionFactory.openSession();
Model model = new Model();
...
session.save(model);
session.flush();
session.close();
即使没有事务,模型也被保存到数据库中,有人能解释吗?
任何意见将不胜感激!谢谢
PS:我正在使用mysql。session.flush命令保存了事务。如果错误,则应使用事务。通常hibernate需要行
session.beginTransaction()代码>开始工作。您没有编写这些,并且您的应用程序工作正常,我猜您的应用程序运行在提供事务管理的应用程序服务器中。e、 jboss,weblogic
然而,这并不意味着没有交易。您是否将自动提交设置为真
顺便说一句,session.flush()和txn.commit()是不同的
刷新是将底层持久存储与内存中的持久状态同步的过程
在session.flush()之后,仍然可以调用txn.rollback()回滚所有更改
编辑
哦,我看见你用弹簧了。您是否在spring中配置了txnmanager?Hibernate不需要事务,基于数据库的应用程序中最常见的问题只是更容易用事务解决,这就是为什么通常每个人都使用Hibernate事务的原因。但这仅仅是巧合/惯例/懒惰
Hibernate只需要一个java.sql.Connection
,如果您的容器提供了一个连接,即使当前没有配置事务管理器,Hibernate也可以
事实上,Hibernate不知道可能存在事务管理器。因此,session.flush()
将使用ApplicationContext
获取连接,生成SQL并使用JDBC将生成的SQL代码发送到数据库
从Hibernate的角度来看,这就是所有发生的事情
将数据提交到数据库可能有以下几个原因:
您忘记打开连接上的自动提交
您的web容器/spring配置自动连接与HTTP请求同步的事务管理器
您的代码从另一个方法调用,该方法用@Transactional
注释;在这种情况下,您将继承现有事务
但是,如果没有声明任何事务,session.flush()如何提交该事务呢?谢谢您的评论!是的,我在spring中配置了txmanager,但这段代码没有@Transactional注释。最后我发现问题是,如果没有声明事务,hibernate会将auto commit设置为true。。。