jFinal中的事务处理方式

无为 发布于 2012/07/12 10:16
阅读 6K+
收藏 0

@JFinal 你好,想跟你请教个问题:昨天看了一下事务处理方式,我的理解是应用了aop的方式,但是具体在调用时是如何处理的呢?还有其他的什么方式呢?请详细帮我分析一下,谢谢!!!

加载中
1
a
alvinte

Tx.java源码如下,看我加的注释

public void intercept(ActionInvocation invocation) {
        if (DbKit.isExistsThreadLocalConnection())
            throw new ActiveRecordException("Nested transaction can not be supported. You can't execute transaction inside another transaction.");
       
        Connection conn = null;
        try {
            conn = DbKit.getDataSource().getConnection();
            DbKit.setThreadLocalConnection(conn);
            conn.setTransactionIsolation(getTransactionLevel());
            conn.setAutoCommit(false);//关键就是把自动提交变成false
            invocation.invoke();//然后调用
            conn.commit();//调用都成功就手动提交
        } catch (Exception e) {//调用失败,捕获异常,就回滚
            if (conn != null)
                try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}
            throw new ActiveRecordException(e);
        }
        finally {
            try {
                if (conn != null) {
                    conn.setAutoCommit(true);//然后还原自动提交状态
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                DbKit.removeThreadLocalConnection();
            }
        }
    }

其他任何类似的方式都可以,关键就那么几个步骤,另外一个控制事务的方式也是一样的原理

0
黎明伟
黎明伟
要不,尝试看看源码?
0
无为
无为

引用来自“alvinte”的答案

Tx.java源码如下,看我加的注释

public void intercept(ActionInvocation invocation) {
        if (DbKit.isExistsThreadLocalConnection())
            throw new ActiveRecordException("Nested transaction can not be supported. You can't execute transaction inside another transaction.");
       
        Connection conn = null;
        try {
            conn = DbKit.getDataSource().getConnection();
            DbKit.setThreadLocalConnection(conn);
            conn.setTransactionIsolation(getTransactionLevel());
            conn.setAutoCommit(false);//关键就是把自动提交变成false
            invocation.invoke();//然后调用
            conn.commit();//调用都成功就手动提交
        } catch (Exception e) {//调用失败,捕获异常,就回滚
            if (conn != null)
                try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}
            throw new ActiveRecordException(e);
        }
        finally {
            try {
                if (conn != null) {
                    conn.setAutoCommit(true);//然后还原自动提交状态
                    conn.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            finally {
                DbKit.removeThreadLocalConnection();
            }
        }
    }

其他任何类似的方式都可以,关键就那么几个步骤,另外一个控制事务的方式也是一样的原理

非常感谢
0
俺木加加
俺木加加

Connection是如何传递到被代理的方法里面的??

invocation.invoke();//这里面调用的Connection是怎么传过来的??

0
JFinal
JFinal

引用来自“缘齐咏”的评论

Connection是如何传递到被代理的方法里面的??

invocation.invoke();//这里面调用的Connection是怎么传过来的??

ThreadLocal
返回顶部
顶部