编程过程中经常遇到需要对数据库进行事务管理,下面就简单介绍一下经常使用的事务管理方式:
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.HibernateTransactionMana
ger">
<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);
..
}