JDBC事务是指从JDBC连接开始,到结束提交或回滚的整个过程。JDBC事务采用的是本地事务的原理,即在一个本地数据库中进行的一组操作。
JDBC事务的使用步骤如下:
DriverManager.getConnection(url,username,password)
方法获取数据库连接对象Connection
。conn.setAutoCommit(false)
关闭自动提交,保证多个SQL语句在同一个事务中执行。conn.prepareStatement(sql)
执行SQL语句,并调用相应的执行方法(如executeQuery()
、executeUpdate()
等)执行。conn.commit()
提交事务;如果SQL语句执行失败,使用conn.rollback()
回滚事务。conn.close()
关闭数据库连接。以下是一个简单的JDBC事务示例,它包含两条SQL语句,用于向一个用户表中插入数据:
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/user", "root", "123456");
conn.setAutoCommit(false);
//第一条SQL语句
String sql1 = "insert into user_info(username,password) values('admin','admin123')";
ps = conn.prepareStatement(sql1);
ps.executeUpdate();
//第二条SQL语句
String sql2 = "insert into user_role(user_id,role_id) values(1,1)";
ps = conn.prepareStatement(sql2);
ps.executeUpdate();
conn.commit();
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException ex) {
e.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JTA(Java Transaction API)分布式事务是指在多个不同的数据源中进行的事务,即跨多个本地事务、多个数据库的事务。JTA采用了两阶段提交协议(2PC),保证事务的原子性、一致性、持久性和隔离性。
JTA分布式事务的使用步骤如下:
UserTransaction
对象:使用InitialContext()
方法获取UserTransaction
接口对象。UserTransaction.begin()
方法开启事务。UserTransaction.commit()
提交事务;如果SQL语句执行失败,使用UserTransaction.rollback()
回滚事务。以下是一个简单的JTA分布式事务示例,它跨越了两个不同的数据源,分别是MySQL和Oracle,用于向两个用户表中插入数据:
UserTransaction tx = null;
Connection con1 = null;
Connection con2 = null;
PreparedStatement ps1 = null;
PreparedStatement ps2 = null;
try {
//获取UserTransaction对象
tx = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
tx.begin();//开启事务
//获取数据库连接
con1 = DriverManager.getConnection("jdbc:mysql://localhost:3306/user", "root", "123456");
con2 = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "123456");
//执行SQL语句
String sql1 = "insert into user_info(username,password) values('admin','admin123')";
ps1 = con1.prepareStatement(sql1);
ps1.executeUpdate();
String sql2 = "insert into user_role(user_id,role_id) values(1,1)";
ps2 = con2.prepareStatement(sql2);
ps2.executeUpdate();
tx.commit();//提交事务
} catch (Exception e) {
if (tx != null) {
try {
tx.rollback();//回滚事务
} catch (Exception ex) {
e.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (ps1 != null) {
try {
ps1.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps2 != null) {
try {
ps2.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con1 != null) {
try {
con1.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con2 != null) {
try {
con2.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC事务和JTA分布式事务的区别主要有以下几点:
JDBC事务和JTA分布式事务是Java中实现事务的两种方式,前者用于本地多个SQL语句操作的事务处理,后者用于涉及多个不同数据库的跨数据库事务处理。在实际开发中,需要根据实际的业务需求选择合适的事务处理方式。
本文链接:http://task.lmcjl.com/news/19073.html