chho的专栏

对于整个世界我微不足道,但是我对于自己确是全部

常浩ID:chho
75202次访问,排名1302(-1)好友0人,关注者1
chho的文章
原创 106 篇
翻译 0 篇
转载 0 篇
评论 24 篇
chho的公告


名字:Chho
JAVA程序员,现在对Linux产生了浓厚的兴趣。

我的Mail:
最近评论
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Hibernate入门27 - 事务管理收藏

    新一篇: Hibernate入门28 - 悲观锁定 | 旧一篇: Hibernate入门26 - Criteria 查询

    入门 27 - 事务管理

     事务是一组原子操作(一组SQL执行)的工作单元,这个工作单元中的所有原子操作在进行期间,与其它事务隔离,免于数据源的交相更新而发生混乱,事务中的所有原子操作,要嘛全部执行成功,要嘛全部失败(即使只有一个失败,所有的原子操作也要全部撤消)。
     在JDBC中,可以用Connection来管理事务,可以将Connection的AutoCommit设定为false,在下达一连串的SQL语句后,自行呼叫Connection的commit()来送出变更,如果中间发生错误,则撤消所有的执行,例如:

    try {

        .....

        connection.setAutoCommit(false);

        .....

     

        // 一连串SQL操作

     

        connection.commit();

    } catch(Exception) {

        // 发生错误,撤消所有变更

        connection.rollback();

    }


     Hibernate本身没有事务管理功能,它依赖于JDBC或JTA的事务管理功能,预设是使用JDBC事务管理,事实上,下面的程序只是对JDBC事务管理作了个简单的封装:

    try {

        session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();

        ....

     

        tx.commit();

    } catch(Exception e) {

        tx.rollback();

    }


     在执行openSession()时,实际上Hibernate是在开启一个Connection,而执行beginTransaction()时,实 际上会执行Connection的setAutoCommit(false)方法,最后的tx.commit()就是呼叫Connection的 commit()方法,有兴趣的话,可以研究net.sf.hibernate.transaction.JDBCTransaction中的begin ()与commit()方法,可以找到对应的JDBC代码。

    session = sessionFactory.openSession();    <--    Connection connection = ....;

    tx = session.beginTransactioin();    <--    connection.setAutoCommit(false);

    tx.commit();    <--   connection.commit();

    session.close();    <--   connection.close();


     所以使用JDBC事务管理,最后一定要执行Transaction的commit(),如果没有,则之前对session所下的所有指令并不会有效果。
     Hibernate可以透过配置文件来使用基于JTA的事务管理,JTA事务管理可以跨越数个Session,而不是像JDBC事务管理只能在一个Session中进行,我们在hibernate.cfg.xml中如下撰写:

    <hibernate-configuration>

        <session-factory>

            ....

            <property name="hibernate.transaction.factory_class">

                net.sf.hibernate.transaction.JTATransactionFactory

            </property>

            ....

        </session-factory>

    </hibernate-configuration>


     或者是在hibernate.properties中撰写:

    hibernate.transaction.factory_class=net.sf.hibernate.transaction.JTATransactionFactory


     JTA的事务是由JTA容器管理,而不是像JDBC事务管理一样由Connection来管理事务,所以我们不是由Session来开始事务,而是如下进行:

    javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

     

    Session s1 = sessionFactory.openSession();

    .... // 一些save、update等

    s1.flush();

    s1.close();

     

    ...

     

    Session s2 = sf.openSession();

    ...

    s2.flush();

    s2.close();

     

    ....

     

    tx.commit();


     同样的,如果您有兴趣,可以看net.sf.hibernate.transaction.JTATransaction中的begin()与commit()方法代码,看看Hibernate如何封装JTA的事务管理代码的。

    发表于 @ 2005年01月27日 20:49:00|编辑

    新一篇: Hibernate入门28 - 悲观锁定 | 旧一篇: Hibernate入门26 - Criteria 查询

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © chho