CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(32),
balance INT
)
SELECT * FROM account;
INSERT INTO account VALUES(NULL,'张三','15000'),(NULL,'李四','5000');
然后做一个银行转账的案例:
张三给李四转账500元
在没有用事务之前如果在两个pstmt之间出现错误会是以下结果是下面这个效果
package zr.jdbc;
import JDBCUtils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 事务的操作
*/
public class JdbcDemo3 {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement pstmt1=null;
PreparedStatement pstmt2=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2
//2.1 张三 - 500
String sql1="update account set balance = balance - ? where name = ?";
//2.2 李四 + 500
String sql2="update account set balance = balance + ? where name = ?";
String name1="张三";
String name2="李四";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4.设置参数
pstmt1.setDouble(1,500);
pstmt1.setString(2,name1);
pstmt2.setDouble(1,500);
pstmt2.setString(2,name2);
pstmt1.executeUpdate();
//手动制造异常
int i=3/0;
pstmt2.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}
结果是张三的账户钱少了500而李四的账户钱不增加500,出现了错误,这就需要用到事务的操作
运用事务对上面程序进行修改之后的代码如下;
package zr.jdbc;
import JDBCUtils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* 事务的操作
*/
public class JdbcDemo3 {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement pstmt1=null;
PreparedStatement pstmt2=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
//2
//2.1 张三 - 500
String sql1="update account set balance = balance - ? where name = ?";
//2.2 李四 + 500
String sql2="update account set balance = balance + ? where name = ?";
String name1="张三";
String name2="李四";
//3.获取执行sql对象
pstmt1 = conn.prepareStatement(sql1);
pstmt2 = conn.prepareStatement(sql2);
//4.设置参数
pstmt1.setDouble(1,500);
pstmt1.setString(2,name1);
pstmt2.setDouble(1,500);
pstmt2.setString(2,name2);
pstmt1.executeUpdate();
//手动制造异常
int i=3/0;
pstmt2.executeUpdate();
//提交事务
conn.commit();
} catch (Exception e) {
if(conn!=null){
try {
conn.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,conn);
JDBCUtils.close(pstmt2,null);
}
}
}
但是数据库里面的数据因为开启了事务没有发生变化,回滚了
这就是事务的主要操作