手工实现JDBC事务管理.docx_第1页
手工实现JDBC事务管理.docx_第2页
手工实现JDBC事务管理.docx_第3页
手工实现JDBC事务管理.docx_第4页
手工实现JDBC事务管理.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

手工实现JDBC事务管理作者:zouzhxi|浏览数(3428)|评论数(0)|2008-07-28 本文关键字 : Java jdbc odbc 事务手工实现JDBC事务管理來源:/user1/11/index.htmlBy: foxty最近由于项目原因,底层数据库访问都必须使用JDBC来操作,为了能更好的实现事务,而且也便于将来移植到Ibatis上去,在作设计的时候参照Ibatis的Dao模式来设计dao,然 后事务控制就必须得自己手工来实现了。并且一起也实现了事务得嵌套。主要依靠2个类来实现。1,TransactionUtil类,负责开启事务,提交事务以及关闭事务。2,Transaction类,用来记录当前事务得状态以及数据库连接。TransactionUtil类package com.orizone.oa.extra.service;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import mon.ConnectionPoolBean;import mons.logging.Log;import mons.logging.LogFactory;import m.util.BusinessException;public class TransactionUtil private final static ThreadLocal local = new ThreadLocal(); private static Log log = LogFactory.getLog(TransactionUtil.class); /* * 开启事务 */ public static void startTransaction()throws BusinessException Transaction tran = (Transaction)local.get(); /判断此事务是否属于一个顶层事务。 if(tran = null) tran = new Transaction(); /设置本地线程的connection Connection con = ConnectionPoolBean.getConnection(); try con.setAutoCommit(false); catch(SQLException e) e.printStackTrace(); throw new BusinessException(e, 开启事务失败!); tran.setConnection(con); tran.setCommitCount(0); tran.setTransCount(1); tran.setTransDeep(1); local.set(tran); else /事务已经开启,将嵌套层次深度加一,将事务次数加一 tran.setTransCount(tran.getTransCount() + 1); tran.setTransDeep(tran.getTransDeep() + 1); /* * 提交事务 * */ public static void commitTransaction()throws BusinessException Transaction tran = (Transaction)local.get(); /如果事务属于嵌套,则不提交数据,直接将层次数减一。 if(tran.getTransDeep() 1) tran.setTransDeep(tran.getTransDeep() - 1); tran.setCommitCount(tran.getCommitCount() + 1); return; Connection con = tran.getConnection(); try if(tran.hasFullExecute() mit(); catch(SQLException e) log.error(e); throw new BusinessException(e, 提交事务失败!); /* * 结束事务 * */ public static void endTransaction()throws BusinessException Transaction tran = (Transaction)local.get(); /如果事务属于嵌套,则不关闭连接,直接将层次数减一。 if(tran.getTransDeep() 1) tran.setTransDeep(tran.getTransDeep() - 1); return; /当前事务已经结束,清空ThreadLocal变量,防止下一次操作拿到已经关闭的Connection对象。 local.set(null); Connection con = tran.getConnection(); try if(!tran.hasFullExecute() con.rollback(); catch(SQLException e) log.error(e); throw new BusinessException(e, 事务回滚失败!); finally try con.close(); catch(SQLException se) log.error(se); throw new BusinessException(se, 关闭事务失败!); /* * 获取当前事务的数据库连接。 * return */ public static Connection getConnection() Transaction tran = (Transaction)local.get(); Connection con = tran.getConnection(); if(con = null) con = ConnectionPoolBean.getConnection(); return con; /* * 测试代码 * param args * throws Exception */ public static void main(String args)throws Exception test(); test(); /* * 测试代码 * */ private static void test() TransactionUtil.startTransaction(); try Connection con = TransactionUtil.getConnection(); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); stmt.executeUpdate(INSERT INTO bb(bb) values(bb); stmt.executeUpdate(INSERT INTO aa(aa) values(aa); /if(true) throw new Exception(); TransactionUmitTransaction(); catch(Exception e) e.printStackTrace(); /throw new BusinessException(); finally TransactionUtil.endTransaction(); Transaction类package com.orizone.oa.extra.service;import java.sql.Connection;public class Transaction /数据库连接对象 private Connection connection; /事务次数 private int transCount; /提交次数 private int commitCount; /事务嵌套层次 private int transDeep; int getCommitCount() return commitCount; void setCommitCount(int commitCount) mitCount = commitCount; Connection getConnection() return connection; void setConnection(Connection conn) this.connection = conn; public int getTransCount() return transCount; void setTransCount(int transCount) this.transCount = transCount; int getTransDeep() return transDeep; void setTransDeep(int transDeep) this.transDeep = transDeep; /* * 判断事务是否完全提交。 * 通过提交次数和事务次数来判断事务是否完全提交。 * return */ boolean hasFullExecute() return commitCount + 1 = transCount; 代码中出现的ConnectionPoolBean是用来负责获取数据库连接的类。整个思想就是,将一个Transaction相关信息(数据库连接对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论