java编程中对事务的处理方式

来源:互联网 发布:淘宝超级店长有什么用 编辑:程序博客网 时间:2024/06/17 22:02
 
 编程过程中经常遇到需要对数据库进行事务管理,下面就简单介绍一下经常使用的事务管理方式:
1、JDBC:JDBC通常的事务管理是通过setAutoCommit来进行的。简要代码如下:
   //得到数据库连接conn
  conn.setAutoCommit(false);//事务开始,设置非自动提交
   prepareStatement或者Statement数据库操作,query,update等。
   conn.commit();//事务提交
  conn.setAutoCommit(true);

  如果发生错误,要回滚处理conn.rollback();
 
2、Hibernate事务处理:
   Session session =Configuration().configure().buildSessionFactory().openSession();
  session.beginTransaction();
   sesion.add(..);
  session.getTransaction().commit();
   session.close();
3、Spring-Hibernate进行事务处理:
(1)普通的代码方式:采用currentSession来进行。对一个表得到currentSession,操作完毕,不用关闭session,另一个表同样得到currentSession操作完毕。错误同样要进行rollback处理。
例如代码如下:
  session =sessionFactory.getCurrentSession();//注意,这里我们使用了spring来帮我们管理事务,所以我们必须获取当前的session,而不是sessionFactory.openSession();
  session.save(user);
  LogManager logManger = new LogManager();
Log log = new Log();
 log.setPath(path);
 log.setName(name);
 logManager.add(log);

错误的时候要进行:session.getCurrentSession.rollback()处理。
在LogManager类中add函数如下:
  session =sessionFactory.getCurrentSession();//注意,这里我们使用了spring来帮我们管理事务,所以我们必须获取当前的session,而不是sessionFactory.openSession();
  session.save(log);

(2)在 applicationContext.xml 中加入事务控制:
<!-- 引用Hibernate的事务管理器--> 
    <beanid="transactionManager" 
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
        <property name="sessionFactory"ref="sessionFactory"></property> 
    </bean> 
<bean id="activeCertDAO"class="com.wapi.dao.ActiveCertDAO">
      <propertyname="sessionFactory">
         <ref bean="sessionFactory" />
      </property>
   </bean>

   <bean id="revokeCertDAO"class="com.wapi.dao.RevokeCertDAO">
      <propertyname="sessionFactory">
         <ref bean="sessionFactory" />
      </property>
   </bean>
   <bean id="certServiceImpl"
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
      <property name="transactionManager"ref="transactionManager"></property>
      <property name="target">
         <beanclass="com.wapi.serviceImpl.CertServiceImpl">
            <property name="acDao">
               <ref bean="activeCertDAO" />
            </property>
            <property name="revoDao">
               <ref bean="revokeCertDAO" />
            </property>
         </bean>
      </property>
      <propertyname="transactionAttributes">
         <props>
            <propkey="changeCertStatueToRevo">PROPAGATION_REQUIRED</prop>
         </props>
      </property>
   </bean>
这里certServiceImpl类包含两个Dao对象
    privateIActiveCertDAO acDao;
    privateIRevokeCertDAO revoDao;
在changeCertStatueToRevo方法中同时对两个表进行了操作。在函数中我们不用管理什么事务处理,只要在applicationContext.xml配置文件中设置了事务处理器org.springframework.orm.hibernate3.HibernateTransactionManager以及Spring事务代理类org.springframework.transaction.interceptor.TransactionProxyFactoryBean,就可以完成事务处理。
其中changeCertStatueToRevo的实现如下:
@Override
    publicboolean changeCertStatueToRevo(int cert_sn) {
       ActiveCertac = acDao.findById(cert_sn);
      acDao.delete(ac);
      java.util.Date now = new java.util.Date();
       Daterevoke_date = new Date(now.getTime());
       RevokeCertrc = new RevokeCert();
      rc.setBeginDate(ac.getBeginDate());
      rc.setCertSn(cert_sn);
      rc.setEndDate(ac.getEndDate());
      rc.setMac(ac.getMac());
      revoDao.insert(rc);
       returnfalse;
    }
(3)通过注释方式加入事务处理:
在applicationContext.xml配置文件中加入:
 <!-- 引用Hibernate的事务管理器 -->  
  <bean id="transactionManager"         class="org.springframework.orm.hibernate3.HibernateTransactionManager"        <property name="sessionFactory" ref="sessionFactory"></property> 
   </bean>   
   <!-- 使用annotation定义事务 -->  
  <tx:annotation-driven transaction-manager="transactionManager" /> 

同时需要在Service层的要使用的方法上声明事务,如:
Java代码
   @Transactional
(readOnly false 

 如果只是对数据库进行查询操作,这里的“readOnly =true“,如果是”增/删/改“操作,则为 false。

例如对changeCertStatueToRevo方法进行事务处理:则

 @Transactional(readOnly false 

public boolean changeCertStatueToRevo(int cert_sn) {
       ActiveCertac = acDao.findById(cert_sn);

..

}

原创粉丝点击