hibernate非事务下session保存信息成功的问题

     我们在一般情况下使用session进行处理时,都使用了spring的HibernateTemplate或者是spring的事务控制。那么在这种情况下,所做的数据库操作,都是在事务的控制之下做的,如果没有事务控制的情况下,hibernate是不是就会回滚相应的事务呢?在这种情况下,是没有事务可言的,具体的操作情况取决于数据库驱动(jdbc)或者连接池提供者的具体实现。
    在大部分的实现里,使用session在进行一个insert操作时,在没有事务的情况下,这个操作仍然会成功。这是因为,大部分的jdbc驱动的connection的autocommit为true,它是处于自动提交模式的;而一般的连接池在提供connection时,也没有对它的自动提交模式作处理(除非特定的设置)。

     如下一段处理代码:

SessionFactory sessionFactory = ApplicationContextManager.getContextBean(SessionFactory.class);
		Session session = sessionFactory.openSession();
		session.save(t);
		System.out.println("完成save....");

    我们通过新开一个session,然后完成一个save操作,在控制台查看输出的sql语句如下(使用了hibernate的语句输出,以及spy6的语句监控):

 

     如上图所示,hibernate发出了sql语句,但并没有发出相应的commit语句,即它没有显式地进行提交操作,在这种情况下,这条语句成功与否,就取决于最终的数据库设置或者驱动了。

     大部分的jdbc驱动(包括mysql,oracle),它的connection的自动提交模式为true,那么在这种情况下,这条记录是被保存到数据库中的。如果,我们通过在程序中设置,autoCommit为false(spring和hibernate在事务控制下,也会设置autocommit为false,在提交时再commit)的话, 那么结果如何呢?通过在session.save(t)之前追加以下代码:

session.connection().setAutoCommit(false);

    结果如下:

Hibernate: 
    insert 
    into
        t_content
        (version, author_id, content, content_date, main_content, project_id, title, user_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
2011-03-11 11:51:09 333|0|4|statement|insert into t_content (version, author_id, content, content_date, main_content, project_id, title, user_id) values (?, ?, ?, ?, ?, ?, ?, ?)|insert into t_content (version, author_id, content, content_date, main_content, project_id, title, user_id) values (0, 2, 'java.io.StringReader@1e8cc67', '2011-03-01', 'sdfsd', 1, 'sdf', 0)
完成save....
=2011-03-11 11:51:09 [com.opensymphony.xwork2.interceptor.TimerInterceptor]-[INFO] Executed action [/admin/cm/content/do/add!add] took 141 ms.

    实际上,输出结果与没有设置自动提交之前的一样。但是实际上,这个结果没有被保存到数据库中,因为它没有显式的提交。在这种情况下,数据库本身会直接忽略到这条记录,而不会提交到数据库中。我们通过查看数据库中的记录,如下所示:

     

     其中20,22中缺少id为21的记录,则即是由于没有提交而忽略的记录。

     那么在这种情况下,session也可以提交记录并进行正确的插入操作。但这并不能说我们就不需要事务支持了,事务支持是保证一系列的操作能够以一个操作单元进行,而这一系列操作则包括多条语句,如果其中一条语句失败了,那么整个操作即会回滚。所以在项目中,并不能因为session操作能够操作成功并不使用事务。

转载请标明出处:i flym
本文地址:https://www.iflym.com/index.php/code/hibernate-non-transaction-session-save-success.html

相关文章:

作者: flym

I am flym,the master of the site:)

发表评论

邮箱地址不会被公开。 必填项已用*标注