在进程数据库操作时候经常需要将多个数据库操作作为一个事务处理,
1、比如delete操作必须删除级联表的相关数据,update操作必须修改级联表的相关数据,insert操作必须在级联表中插入相应数据。如银行数据的安全性
2、一个数据库表的多次delete、update、insert操作(当然这个可以用存储过程处理)
本次操作需要删除多次执行结果,但要做到一个删除失败,其他的都不可以删除。使用JdbcTemplate进行事务处理。代码如下:
private PlatformTransactionManager transactionManager;
public PlatformTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(PlatformTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
@Override
public List<Integer> delExcResuListByResuIdList(List<Integer> excuteResultIdList) throws SQLException {
// 正在运行不可删除
List<Integer> failExcResuIdList = new ArrayList<Integer>();
List<Integer> runningExcuteResultIdList = getRunningExcuteResultId();
// 一致删除
DefaultTransactionDefinition defTransacDef = new DefaultTransactionDefinition();
TransactionStatus transacstatus = transactionManager.getTransaction(defTransacDef);
for (int excuteResultId : excuteResultIdList) {
if (runningExcuteResultIdList.contains(excuteResultId))
failExcResuIdList.add(excuteResultId);
else
excuteResultDao.delExcResuByResuId(excuteResultId);
}
if (failExcResuIdList.size() > 0)
transactionManager.rollback(transacstatus);
else
transactionManager.commit(transacstatus);
return failExcResuIdList;
}
datasource配置文件添加
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"> <ref local="dataSource"/> </property> </bean>
mysql数据库相关连的表类型改为InnoDB
参考:http://www.blogjava.net/sslaowan/archive/2007/02/06/98378.html
http://www.iteye.com/wiki/Spring-source/1223-Spring声明式事务管理源码解读之事务开始
http://www.iteye.com/wiki/Spring-source/1219-Spring声明式事务管理源码解读之事务提交