JDBC中事物是什么:
概念:事务是指一组操作,要么都执行成功,要么都执行失败。
四大特性:
1)原子性:一组操作,要么都执行成功,要么都执行失败。
2)隔离性:在所有操作未完成之前,其他回话是不能看到中间过程的。
3)一致性:事物发生和发生后的总金额依然匹配。
4)持久性:事务产生的影响是不能撤销的。
为什么需要进行事物处理:
如果在程序执行中出现错误,已经执行的sql语句将会改变数据库数据,但后续sql语句并未执行,会造成数据被错误改变,例如银行转账中,张三给李四转账500块,但因为系统突发错误张三账户上减少500元,但李四并未收到500,造成这500凭空消失,这时就需要进行事物处理,将张三转账500和李四接收500操作放在一个事务下进行管理,正常情况全部执行,如果有异常出现,则回滚事务。
转张案例代码编写:
1.不使用事物:
public static void main(String[] args) throws Exception {
//注册驱动 从JDK1.6之后,JDBC的版本已经是4.0,可以不用手动注册驱动了。
Class.forName("com.mysql.jdbc.Driver");
//获取连接 这里MySQL用的是5.5版本
//MySQL8.0版本之后url语句为:jdbc:mysql://localhost:3306/数据库名称?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
String url = "jdbc:mysql://localhost:3306/db1";
//写入数据库账号密码
Connection conn = DriverManager.getConnection(url, "root", "root");
// 编写sql
// 张三给李四转张500 张三id=1 李四id=2
String sql = "update account set money = money - 500 where id = 1";
String sql1 = "update account set money = money + 500 where id = 2";
// 获取执行sql对象
Statement statement = conn.createStatement();
// 执行sql
int i = statement.executeUpdate(sql);
//0不能作为分母 程序运行到这里会报错
System.out.println(100 / 0);
int i1 = statement.executeUpdate(sql1);
// 输出受影响行数
System.out.println(i);
System.out.println(i1);
// 关闭资源
statement.close();
conn.close();
}
运行前sql数据库数据:
运行后sql数据库数据:
这里可以看见张三账户中钱减少了,但是李四并没有增加。
2.使用事物:
public static void main(String[] args) throws ClassNotFoundException {
Connection conn = null;
Statement statement = null;
try {
//注册驱动 从JDK1.6之后,JDBC的版本已经是4.0,可以不用手动注册驱动了。
Class.forName("com.mysql.jdbc.Driver");
//获取连接 这里MySQL用的是5.5版本
//MySQL8.0版本之后url语句为:jdbc:mysql://localhost:3306/数据库名称?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
String url = "jdbc:mysql://localhost:3306/db1";
//写入数据库账号密码
conn = DriverManager.getConnection(url, "root", "root");
//开启事务
conn.setAutoCommit(false);
// 编写sql
// String sql = "update emp set salary = 3000";
String sql = "update account set money = money - 500 where id = 1";
String sql1 = "update account set money = money + 500 where id = 2";
// 获取执行sql对象
statement = conn.createStatement();
// 执行sql
int i = statement.executeUpdate(sql);
System.out.println(100 / 0);
int i1 = statement.executeUpdate(sql1);
// 返回受影响行数
System.out.println(i);
System.out.println(i1);
//提交事务
conn.commit();
} catch (SQLException e) {
try {
//事物回滚
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
System.out.println("转账失败");
e.printStackTrace();
} finally {
try {
// 释放资源
statement.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
运行前sql数据库数据:
运行后sql数据库数据:
这里可以看见数据库并未发生变化说明事物回滚成功。