事务控制是Java EE 应用中必须处理的问题,它可以保证一系列数据库操作能够准确完成 事务分为局部事务和全局事务
我们先了解一下 什么是事务:
事务是由一步或几步数据操作序列组成的逻辑执行单元,这系列操作要么全部完成,要么全部放弃执行。
事务的四个特性(ACID):原子性,一致性,隔离性,持续性,
JTA,即Java Transaction API,提供了事务划分的标准结构。JTA事务由Java EE事务管理器控制,它可以保证多个数据库更新的一致性吗,通过JTA即可实现全局事务控制
JTA事务和JDBC 事务的区别:
JTA事务可以跨连接
JDBC仅限于一个连接
实例演示:
package com.jta;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.transaction.NotSupportedException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
public class JTATest
{
public static void main(String[] args) throws SQLException
{
System.out.println("begin test");
Hashtable cs = new Hashtable();
cs.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
cs.put(Context.PROVIDER_URL, "t3://localhost:7001");
//UserTransaction userTransaction = null;
DataSource ds1 = null;
DataSource ds2 = null;
Context ctx = null;
try
{
ctx = new InitialContext(cs);
//userTransaction = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");
//userTransaction.begin();
ds1 = (DataSource)ctx.lookup("MySqlDs");
ds2 = (DataSource)ctx.lookup("Mysqlds2");
}
catch (Exception E)
{
System.out.println("Init Error: " + E);
}
Connection conn1 = null;
Connection conn2 = null;
Statement stmt1 = null;
Statement stmt2 = null;
try
{
conn1 = ds1.getConnection();
conn2 = ds1.getConnection();
stmt1 = conn1.createStatement();
stmt2 = conn2.createStatement();
String sql1 = "insert into temp(id,name) values(11,'sql1');";
String sql2 = "insert into temp(id,name) values(12,'sql2');";
int sun1 = stmt1.executeUpdate(sql1);
int sun2 = stmt2.executeUpdate(sql2);
String sql11 = "insert into temp(id,name) values(13,'sql11');";
String sql21 = "insert into temp(id,name) values(13,'sql21');";
int sun11 = stmt1.executeUpdate(sql11);
int sun21 = stmt2.executeUpdate(sql21);
//userTransaction.commit();
System.out.println("Success!");
}
catch (Exception e)
{
// try
// {
// if (null != userTransaction)
// {
// userTransaction.rollback();
// }
// }
// catch (Exception e1)
// {
// e1.printStackTrace();
// }
e.printStackTrace();
}
finally
{
if (stmt1 != null)
{
stmt1.close();
}
if (stmt2 != null)
{
stmt2.close();
}
if (conn1 != null)
{
conn1.close();
}
if (conn2 != null)
{
conn2.close();
}
}
}
}
在Weblogic 上创建 多个数据源,可知,当插入数据冲突时,之前不冲突的数据照样被插入数据库中了
使用JTA ,即代码中去掉注释重新执行,可知,当插入数据冲突时,之前不冲突的数据也不会被插入数据库中