注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hive Flume等等~写的都是纯干货,各种顶会的论文解读,一起进步。
今天和大家分享一下Java之JDBC事务代码案例
#博学谷IT学习技术支持#
前言
在我们今天要讲的数据库中的事务,就可以理解为一条或一组SQL语句,这个事务成功的执行的必要条件就是其中的SQL全部执行成功,如果其中的任一SQL执行失败(没有达到预期效果),则此次事务执行失败,所有的SQL都不会对数据库中的数据产生变更。
简单的说就是要么一起成功,要么一起失败。
一、使用步骤 1.创建一个简单的sql表,插入数据
create table aaa.account(
aid int primary key ,
aname varchar(20),
money double
);
insert into aaa.account (aid,aname,money) VALUES (1001,'zhangsan',1000);
insert into aaa.account (aid,aname,money) VALUES (1002,'lisi',1000);
2.定义jdbc.properties文件
DriverClass=com.mysql.cj.jdbc.Driver Url=jdbc:mysql://localhost:3306/aaa Username=root Password=123456783.定义JDBCUtils类
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JDBCUtils {
private static Properties map;
private static String driverClass;
private static String url;
private static String username;
private static String password;
private static String sql;
private JDBCUtils(){}
//封装注册驱动.这里是mysql 8.0的版本
static {
try {
InputStream inputStream =
JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
map = new Properties();
map.load(inputStream);
driverClass = map.getProperty("DriverClass");
url = map.getProperty("Url");
username = map.getProperty("Username");
password = map.getProperty("Password");
sql = map.getProperty("Sql");
Class.forName(driverClass);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//封装获得连接
public static Connection getConnection(){
try {
return DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
4.定义一个事务的测试类
//事务案例
//1开启事务
//2提交事务
//3回滚事务
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class demo1 {
public static void main(String[] args) {
Connection connection = JDBCUtils.getConnection();
try {
//关闭事务的自动提交
//默认情况下一条sql单独开启事务
connection.setAutoCommit(false);
PreparedStatement pst1 = connection.prepareStatement("update account set money = money -1000 where aname = 'zhangsan'");
int rows1 = pst1.executeUpdate();
//这里故意报个错,如果发生错误就整体运行失败,之前代码也不会执行,要么一起成功,要么一起失败。
System.out.println(1 / 0);
PreparedStatement pst2 = connection.prepareStatement("update account set money = money +1000 where aname = 'lisi'");
int rows2 = pst2.executeUpdate();
//提交事务
if (rows1 == 1 && rows2 == 1) {
connection.commit();
}
} catch (Exception e) {
e.printStackTrace();
//回滚事务
try {
connection.rollback();
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
}
}
总结
connection.setAutoCommit(false);
connection.commit();
connection.rollback();
事务其实非常简单,如果事务中发生错误就整体运行失败,之前sql代码也不会执行,要么一起成功,要么一起失败。一般就用这个。



