数据库总结——在程序中显示保证事务操作的原子性

本文展示了一个使用Java和MySQL实现的事务操作原子性的示例。通过插入两条记录到数据库,如果任一操作失败,将回滚所有更改,确保数据的一致性和完整性。

事务的

在程序中显示保证事务操作的原子性示例

下面向表里面插入两个人名,如果两个都成功,就一起成功提交commit,
如果失败了,就一起不做操作,回滚到没有任何插入操作的情况。
这里把占位符(?,?,?)删掉一个就可以引起异常,
可以运行两次,对比查看效果。
第一次没有异常,正确运行,
第二次,少了个占位符,异常,报错,查看数据库,没有执行。


package db.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 事务的基本用法
 *
 */
public class Test {
  public static void main(String[] args) {
    Connection conn = null;
    PreparedStatement ps1 = null;//预执行,他只是打标记,还没有真正执行
    PreparedStatement ps2 = null;
    try {
      // 加载驱动类
      Class.forName("com.mysql.cj.jdbc.Driver");
      conn = DriverManager.getConnection(
          "jdbc:mysql://localhost:3306/pickme?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true",
          "root", "root");//这里用的mysql8的库
      conn.setAutoCommit(false); // JDBC中默认是true,自动提交事务
      ps1 = conn.prepareStatement(
          "insert into person (telphone,password,openid) values (?,?,?)");// ?是占位符
          //执行预执行的statement,尚未commit
      ps1.setObject(1, "电话2");
      ps1.setObject(2, "密码");
      ps1.setObject(3, "21asdsfaerf");
      ps1.execute();
      System.out.println("插入一个用户张三");
      try {
        Thread.sleep(3000);//等一会儿,模拟网络传输的时延情况,如果出错,报错
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      ps2 = conn.prepareStatement(
          "insert into person (telphone,password,openid) values (?,?,?)");
      ps2.setObject(1, "电话:李四2");
      ps2.setObject(2, "密码:123456");
      ps2.setObject(3, "21asdsfaerf");
      ps2.execute();
      System.out.println("插入一个用户李四");
      conn.commit();// 提交事务
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      try {
        conn.rollback();// 某一条数据添加失败时(报异常),回滚到开始
      } catch (SQLException e1) {
        e1.printStackTrace();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        if (ps1 != null) {
          ps1.close();//关闭描述
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
      try {
        if (conn != null) {
          conn.close();//关闭数据库连接
        }
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值