JDBC事务处理

事务

一,事务:一组逻辑操作单元,是数据从一种状态变换到宁一种状态。
事务处理:当在一个事务中执行多个操作时,要么所有的事务都被提交,这些修改就永久的保存下来,要么执行多个操作时,有一部分操作错误,那么整个事务全部视为错误,数据全部回滚到初始状态。
二,JDBC事务处理
数据的提交:数据一旦提交,就不可回滚
1,当一个连接对象被创建时,默认情况下时自动提交事务,每一次执行一条SQL语句时,执行成功就会向数据库自动提交,不能回滚。
2,关闭数据库连接,数据就会自动提交。即同一个事务的多个操作必须在同一个连接下。
下列代码:使用事务之后通用的增删改

public static void setSQL(Connection conn, String sql, Object... args) {
PreparedStatement ps = null;
try {
   // 实例化PreparedStatement,预编译sql语句
   ps = conn.prepareStatement(sql);
   // 填充占位符
   for (int i = 0; i < args.length; i++) {
    ps.setObject(i + 1, args[i]);
   }
   // 执行sql语句
   ps.execute();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   // 关闭资源,连接不能关闭
   JDBCUtils.closeRsource(null, ps);
  }
 }

测试方法是否正确:

Connection conn = null;
  try {
  // 获取一个连接,一个事务公用一个连接
   conn = JDBCUtils.getConnection();
   // 关闭连接的自动提交
   conn.setAutoCommit(false);
   String s1 = "UPDATE user_table SET balance=? WHERE `user`=?";
   setSQL(conn, s1, 500, "AA");
   // 模拟异常,测试事务是否正确
   // System.out.println(10 / 0);
   setSQL(conn, s1, 1500, "BB");
   conn.commit();
   } catch (Exception e) {
   e.printStackTrace();
   try {
    // 出现异常数据将回滚初始状态
    conn.rollback();
   } catch (SQLException e1) {
    e1.printStackTrace();
   }
   } finally {
   try {
    // 事务完成后,将自动提交开启
    conn.setAutoCommit(true);
   } catch (SQLException e) {
    e.printStackTrace();
   }
   // 关闭连接
   JDBCUtils.closeRsource(conn, null);
  }
 }

三,数据库的并发问题
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:脏读,不可重复读,幻读。隔离级别越高, 数据一致性就越好, 但并发性越弱。
数据库的四种隔离机制:
在这里插入图片描述

Mysql 支持 4 种事务隔离级别。Mysql 默认的事务隔离级别为: REPEATABLE READ。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值