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

 
  编程过程中经常遇到需要对数据库进行事务管理,下面就简单介绍一下经常使用的事务管理方式:
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.HibernateTransactionMana ger"> 
                <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.TransactionProxyFactoryB ean">
            <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.HibernateTransactionMana ger以及Spring事务代理类org.springframework.transaction.interceptor.TransactionProxyFactoryB ean,就可以完成事务处理。
其中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);

..

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值