事务的
在程序中显示保证事务操作的原子性示例
下面向表里面插入两个人名,如果两个都成功,就一起成功提交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();
}
}
}
}

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

被折叠的 条评论
为什么被折叠?



