问题:客户在其数据库操作过程中需要
![](/icons/87901diaoyong.gif)
![](/icons/87901de.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou2.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
如何保证JDBC事务
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
想到
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou.gif)
![](/icons/87901dou2.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou2.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou2.gif)
想到
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
![](/icons/87901yinwei.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
![](/icons/87901dou2.gif)
想到
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou2.gif)
![](/icons/87901dou2.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901dou.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901dou.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou2.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901kh.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
JDBC事务实际要注意
![](/icons/87901de.gif)
1、将session和当前线程绑定使用
![](/icons/87901de.gif)
![](/icons/87901kh.gif)
![](/icons/87901dou.gif)
2、我们
![](/icons/87901de.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou.gif)
3、我们服务
![](/icons/87901diaoyong.gif)
![](/icons/87901yi.gif)
![](/icons/87901dou.gif)
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
最终解决:使用了spring里常用
![](/icons/87901de.gif)
![](/icons/87901dou2.gif)
public
TransactionTemplate {
protected final Log logger = LogFactory.getLog(TransactionTemplate.
);
private FlushMode flushMode = FlushMode.ALWAYS;
public Object execute(TransactionCallback callback) {
//首先获取sessionFactory
SessionFactory sessionFactory = (SessionFactory) Framework.getEngine
.getContainer
.getComponent("sessionFactory");
//创建
个新
session并打开
logger.debug("Opening single Hibernate Session in TransactionTemplate");
Session session = getSession(sessionFactory);
//将session和当前线程绑定
TransactionSynchronizationManager.bindResource(sessionFactory,
SessionHolder(session));
//获取数据库连接
Connection conn = session.connection
;
Object result = null;
Transaction transaction = null;
try {
//开始处理JDBC事务
transaction = session.beginTransaction
;
try {
result = callback.doInTransaction(conn);
}
catch (RuntimeException ex) {
doRollback(session, transaction);
throw ex;
}
catch (Error err) {
doRollback(session, transaction);
throw err;
}
//如果数据库操作过程中没有发生异常则提交事务
transaction.commit
;
} catch (WorkflowException e) {
logger.error("数据库操作失败
事务回滚也失败!");
throw e;
} catch (RuntimeException ex) {
logger.error("数据库操作失败
事务被回滚!");
throw ex;
} catch (Error err) {
logger.error("数据库操作失败
事务被回滚!");
throw err;
} finally {
// 将session和当前线程解除绑定
TransactionSynchronizationManager.unbindResource(sessionFactory);
doClose(session);
}
result;
}
protected Session getSession(SessionFactory sessionFactory) {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
FlushMode flushMode = getFlushMode
;
(flushMode != null) {
session.
FlushMode(flushMode);
}
session;
}
private void doRollback(Session session, Transaction transaction) {
logger.debug("数据库操作异常
开始回滚事务");
try {
transaction.rollback
;
logger.debug("回滚事务成功!");
}
catch (Exception e) {
logger.error("回滚事务失败!");
throw
WorkflowException("回滚事务失败!");
} finally {
session.clear
;
}
}
private void doClose(Session session) {
logger.debug("开始关闭连接");
try {
session.close
;
}
catch (Exception e) {
logger.error("关闭连接失败!");
throw
WorkflowException("关闭连接失败!");
}
}
public FlushMode getFlushMode
{
flushMode;
}
public void
FlushMode(FlushMode flushMode) {
this.flushMode = flushMode;
}
}
public
erface TransactionCallback {
Object doInTransaction(Connection conn);
}
伪代码:
public void methodA
{
TransactionTemplate transactionTemplate=
TransactionTemplate
;
transactionTemplate.execute(
TransactionCallback
{
public Object doInTransaction(Connection conn) {
//客户代码
client.method1("1");
//我们代码 直接使用
our.method2
;
//客户代码
client.method3("l");
null;
}
});
}
最新评论