选择显示字体大小

分析hibernate的事务处理机制

  hibernate是对jdbc的轻量级对象封装,hibernate本身是不具备transaction处理功能的,hibernate的transaction实际上是底层的jdbc transaction的封装,或者是jta transaction的封装,下面我们详细的分析:

  hibernate可以配置为jdbctransaction或者是jtatransaction,这取决于你在hibernate.properties中的配置:

#hibernate.transaction.factory_class
.net.sf.hibernate.transaction.jtatransactionfactory
#hibernate.transaction.factory_class
.net.sf.hibernate.transaction.jdbctransactionfactory

  如果你什么都不配置,默认情况下使用jdbctransaction,如果你配置为:

hibernate.transaction.factory_class
.net.sf.hibernate.transaction.jtatransactionfactory

  将使用jtatransaction,不管你准备让hibernate使用jdbctransaction,还是jtatransaction,我的忠告就是什么都不配,将让它保持默认状态,如下:

#hibernate.transaction.factory_class
.net.sf.hibernate.transaction.jtatransactionfactory
#hibernate.transaction.factory_class
.net.sf.hibernate.transaction.jdbctransactionfactory

  在下面的分析中我会给出原因。

  一、jdbc transaction

  看看使用jdbc transaction的时候我们的代码例子:

session session = sf.opensession();
transaction tx = session.begintransactioin();
...
session.flush();
tx.commit();
session.close();

  这是默认的情况,当你在代码中使用hibernate的transaction的时候实际上就是jdbctransaction。那么jdbctransaction究竟是什么东西呢?来看看源代码就清楚了:

  hibernate2.0.3源代码中的类

 .net.sf.hibernate.transaction.jdbctransaction:

public void begin() throws hibernateexception {
...
if (toggleautocommit) session.connection().setautocommit(false);
...
}

  这是启动transaction的方法,看到 connection().setautocommit(false) 了吗?是不是很熟悉?

  再来看

public void commit() throws hibernateexception {
...
try {
if ( session.getflushmode()!=flushmode.never ) session.flush();
try {
session.connection().commit();
committed = true;
}
...
toggleautocommit();
}

  这是提交方法,看到connection().commit() 了吗?下面就不用我多说了,这个类代码非常简单易懂,通过阅读使我们明白hibernate的transaction都在干了些什么?我现在把用hibernate写的例子翻译成jdbc,大家就一目了然了:

connection conn = ...; <--- session = sf.opensession();
conn.setautocommit(false); <--- tx = session.begintransactioin();
... <--- ...
conn.commit(); <--- tx.commit(); (对应左边的两句)
conn.setautocommit(true);
conn.close(); <--- session.close();

  看明白了吧,hibernate的jdbctransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在hibernate中,session打开的时候,就会自动conn.setautocommit(false),不像一般的jdbc,默认都是true,所以你最后不写commit也没有关系,由于hibernate已经把autocommit给关掉了,所以用hibernate的时候,你在程序中不写transaction的话,数据库根本就没有反应。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons