在一般的数据库操作中,我们可以利用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
.......本文将陆续补充完善