一、JDBC事务
(一)概述
mysql默认是自动提交事务的,如果想同时执行多条SQL语句,而且要保证多条SQL同时成功,那么就需要手动的来提交事务。
Jdbc默认也是自动提交事务的,可以设置为手动提交。
为了让多个 SQL 语句作为一个事务执行:
调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务。。
在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
在出现异常时,调用 rollback(); 方法回滚事务。
(二)案例
1.需求
转账案例,账户1向账户2转账。要求事务控制,保证同时成功或同时失败。
2.数据准备
创建账户表,添加数据
create table account(
id int primary key, -- 账户id
money int -- 账户钱数
);
insert into account values(1,10000);
insert into account values(2,10000);
3.示例代码
(1)不加入事务控制
public class Demo06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入转出账户");
String outId = sc.nextLine();
System.out.println("请输入转入账户");
String inId = sc.nextLine();
System.out.println("请输入转账金额");
String money = sc.nextLine();
Connection conn = null;
Statement st = null;
try{
conn = JdbcUtil.getConnection();
st = conn.createStatement();
String sql = "update account set money=money-"+money+" where id="+outId;
String sql2 = "update account set money=money+"+money+" where id="+inId;
int result1 = st.executeUpdate(sql);
// 如果在此处发生了异常, sql执行成功,sql2没有执行,将会出现问题,因此 //需要事务控制
//int x = 10/0;
int result2 = st.executeUpdate(sql2);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(conn,st);
}
}
}
(2)事务控制
package com.offcn.test;
import com.offcn.utils.JdbcUtil;
import java.sql.Connection;
impo