zoukankan      html  css  js  c++  java
  • 事务种类jdbc,Hibernate,JTA事务

    JDBC事务

    String URL="jdbc:sqlserver://localhost:1433;databaseName=test2";
    String USER="sa";
    String PASSWORD="sapassword";

    try
    {
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
    Statement s = conn.createStatement();
    ResultSet rs = s.executeQuery("select * from t_user");
    while(rs.next())
    {
    System.out.println(rs.getString("name")+"...age:"+rs.getString("age"));
    }
    rs.close();
    s.close();
    conn.close();
    } catch (ClassNotFoundException | SQLException e)
    {
    e.printStackTrace();
    }

    在Hibernate中使用JDBC事务

    Hibernate对JDBC进行了轻量级的封装,它本身在设计时并不具备事务处理功能。Hibernate将底层的JDBCTransaction或JTATransaction进行了封装,再在外面套上Transaction和Session的外壳,其实是通过委托底层的JDBC或JTA来实现事务的处理功能的。

    要在Hibernate中使用事务,可以在它的配置文件中指定使用JDBCTransaction或者JTATransaction。在hibernate.properties中,查找“transaction.factory_class”关键字,得到以下配置:

    # hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
    # hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

    Hibernate的事务工厂类可以设置成JDBCTransactionFactory或者JTATransactionFactory。如果不进行配置,Hibernate就会认为系统使用的事务是JDBC事务。

    在JDBC的提交模式(commit mode)中,如果数据库连接是自动提交模式(auto commit mode),那么在每一条SQL语句执行后事务都将被提交,提交后如果还有任务,那么一个新的事务又开始了。

    Hibernate在Session控制下,在取得数据库连接后,就立刻取消自动提交模式,即Hibernate在一个执行Session的beginTransaction()方法后,就自动调用JDBC层的setAutoCommit(false)。如果想自己提供数据库连接并使用自己的SQL语句,为了实现事务,那么一开始就要把自动提交关掉(setAutoCommit(false)),并在事务结束时提交事务。

    使用JDBC事务是进行事务管理最简单的实现方式,Hibernate对于JDBC事务的封装也很简单。下面是一个在Hibernate中使用JDBC事务的例子:

    try {
    Session session = HibernateUtil.currentSession();
    Transaction tx = session.beginTransaction();  //在默认情况下,开启一个JDBC事物
    for(int i=0; i<10; i++)  {
    Student stu = new Student();
    stu.setName("Student" + i);
    session.save(stu);
    }
    tx.commit(); //提交事务
    session.close();
    } catch(Exception e) {…
    tx.rollback();   //事务回滚
    }

    在Hibernate中使用JTA事务

    JTA(Java Transaction API)是事务服务的J2EE解决方案。本质上,它是描述事务接口的J2EE模型的一部分,开发人员直接使用该接口或者通过J2EE容器使用该接口来确保业务逻辑能够可靠地运行。

    JTA有3个接口,它们分别是UserTransaction接口、TransactionManager接口和Transaction接口。这些接口共享公共的事物操作,例如commit()和rollback(),但也包含特殊的事务操作,例如suspend()、resume()和enlist(),它们只出现在特定的接口上,以便在实现中允许一定程度的访问控制。

    在一个具有多个数据库的系统中,可能一个程序会调用几个数据库中的数据,需要一种分布式事务,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTA事务。下面介绍如何在Hibernate的配置文件中配置JTA事务。在hibernate.properties文件中设置如下(把JTATransactionFactory所在的配置行的注释符“#”取消掉):

    hibernate.transaction.factory_class  org.hibernate.transaction.JTATransactionFactory
    # hibernate.transaction.factory_class  org.hibernate.transaction.JDBCTransactionFactory

    或者在hibernate.cfg.xml文件中配置如下:

    <session-factory>
    …..
    <property name=” hibernate.transaction.factory_class”>
    org.hibernate.transaction.JTATransactionFactory
    </property>
    ……
    </session-factory>

    下面是一个应用JTA事务的例子:

    javax.transaction.UserTransaction tx = null;
    tx = new initialContext().lookup(” javax.transaction.UserTransaction ”) ;
    tx.begin();
    Session s1 = sf.openSession();
    ……
    s1.flush();  s1.close();
    Session s2 = sf.openSession();
    ……
    s2.flush();  s2.close();
    tx.commit();
    没有写不了的程序,只有想不到的思路!Just do it!
  • 相关阅读:
    Mybatis详解(二)
    Mybatis详解(一)
    Java集合
    Java基础之IO
    Java异常知识点!
    HTTP状态码
    ajax传字符串时出现乱码问题的解决
    Json 文件 : 出现 Expected value at 1:0 问题的解决
    java @XmlTransient与@Transient区别
    文件的上传和回显
  • 原文地址:https://www.cnblogs.com/daxiong225/p/9385424.html
Copyright © 2011-2022 走看看