当前位置: 代码迷 >> 综合 >> java [30] jdbc 事务(ACID)处理
  详细解决方案

java [30] jdbc 事务(ACID)处理

热度:46   发布时间:2023-12-06 08:38:17.0

事务(ACID)

原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。

一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)

隔离性(isolcation):一个事务处理对另一个事务处理的影响。

持续性(durability):事务处理的效果能够被永久保存下来 。

connection.setAutoCommit(false);//打开事务。

connection.commit();//提交事务。

connection.rollback();//回滚事务。

 

当只想撤销事务中的部分操作时可使用SavePoint

SavePoint sp = connection.setSavepoint();

connection.rollerbak(sp);connection.commit();

package com.us.test;/** 事务处理:需求给id为1的用户增加100元,* 给id2用户减少100* 如果id为2的用户钱大于2900,就抛出异常* */import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import com.us.daoimpl.jdbcUtils;public class Acidtest {public static void main(String[] args) {// TODO Auto-generated method stubtry {test();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static void test() throws SQLException {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = jdbcUtils.getConnection();//打开事务  为true则会自动提交,一般设置为falseconn.setAutoCommit(false);String sql = "update userInfo set  money =money +100 where id =1";st = conn.createStatement();st.executeUpdate(sql);sql = "select money from userInfo where id =2";rs = st.executeQuery(sql);float f =0.0f;if (rs.next()) {f =rs.getFloat("money");}if (f >2900) {throw new RuntimeException("已经超过最大值");}sql = "update userInfo set  money =money -100 where id =2";st.executeUpdate(sql);//提交 conn.commit();} catch (SQLException e) {if (conn!=null) {conn.rollback();throw e;}}finally {jdbcUtils.free(rs, st, conn);}		}
}

跨数据库事务:(JTA)-----(不同银行转账)

分成两阶段提交。

javax.transaction.UserTransaction tx = (UserTransaction)ctx.lookup(“jndiName");

tx.begin();

//connection1 connection2 (可能来自不同的数据库)…

tx.commit();

//tx.rollback();

  相关解决方案