在weblogic中使用UserTransaction

在一般的数据库操作中,我们可以利用Jdbc的事务机制,或者利用数据库存储过程来实现业务过程的完整性:

conn.setAutoCommit(false);....do something.....conn.commit().......conn.roolback()

在weblogic中为我们提供了一种更加灵活的事务处理机制,它利用一个外部的事务管理器来管理事务:

下面是一个简单例子:

package weblogic;

import java.sql.*;

import java.util.Hashtable;

import javax.naming.*;
import javax.naming.Context;
import javax.naming.InitialContext;

import javax.sql.DataSource;

import javax.transaction.*;
import javax.transaction.UserTransaction;


public class TransactionTest {

    static Context    ctx        = null;
    static DataSource dataSource = null;

    static {

        Hashtable env = new Hashtable();

        env.put (Context.INITIAL_CONTEXT_FACTORY,
            "weblogic.jndi.WLInitialContextFactory");
        env.put (Context.PROVIDER_URL, "t3://localhost:80");
        env.put (Context.SECURITY_PRINCIPAL, "cofbean");
        env.put (Context.SECURITY_CREDENTIALS, "????");

        try {

            ctx = new InitialContext(env);
        }
        catch (NamingException ex) {

            ex.printStackTrace ();
        }
    }

    private static UserTransaction getTransaction() {

        UserTransaction tx = null;

        try {

            tx = (UserTransaction) ctx.lookup (
                    "javax.transaction.UserTransaction");
        }
        catch (NamingException ex) {

            ex.printStackTrace ();
        }

        return tx;
    }

    private static DataSource getDataSource(String dataSourceName) {

        if (dataSource == null) {

            try {

                dataSource = (DataSource) ctx.lookup (dataSourceName);
            }
            catch (NamingException ex) {

                ex.printStackTrace ();
            }
        }

        return dataSource;
    }

 

    private static void doit() throws Exception {

        Connection      conn = null;
        UserTransaction tx = null;

        try {

            tx = getTransaction ();
            tx.begin ();//-----------------------------

            //连接创建必须放入事务范围才行
           conn     = getDataSource ("sqlds1").getConnection ();            

           conn     = getDataSource ("sqlds2").getConnection ();

            Statement st = conn.createStatement ();
            Statement st2 = conn.createStatement ();
            st.executeUpdate ("insert into /"users/" values('111','2222'
)");

            st2.executeUpdate ("insert into /"users/" values('222','22222')");//出错

            tx.commit ();//--------------------------------------------------------------------
        }
        catch (Exception ex) {

            tx.rollback ();

            ex.printStackTrace ();
        }
        finally {

            conn.close ();
        }
    }

    public static void main(String [] args) {

        try {

            doit ();
        }

        catch (Exception ex) {
            ex.printStackTrace ();
        }
    }

}

weblogic中的事务处理机制和数据源以及连接池参数的配置有密切的关系:

1.如果不想在应用中支持事务,那么在建立连接池时不要选择XA类型的数据库驱动,并且在配置数据源时不要选择“支持全局事务“和“模拟两阶段提交”,这样即使在程序中使用了事务代码也不起作用。

2.想在程序中支持事务的话一种办法是在建立连接池时选择XA类型驱动,并在配置数据源时不要选择“模拟两阶段提交”,这种办法主要是为了实现跨资源(比如两个数据库)的事务处理,一般的事务使用下面的方法:

3.用普通的驱动建立连接池,在数据源配置中选择支持全局事务,这样就可以实现单资源的事务,如果要跨资源,则需选择“模拟两阶段提交“

4.还有一种办法实现单资源事务:利用weblogic.jdbc.jts.Driver直接从连接池得到connection

.......本文将陆续补充完善

你可能感兴趣的:(术业专攻)