JDBC_12_JDBC事务
JDBC事务
-
JDBC中事务默认自动提交,每执行一次SQL就会自动提交一次。 这样的话可能出现数据安全性问题。
-
connection.setAutoCommit(false) false代表关闭自动提交事务 true代码自动提交事务
-
connection.commit(); 没有异常 手动提交事务
-
connection.rollback(); 存在异常 手动回滚事务
-
代码:
```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
* JDBC操作数据库,模拟银行转账
* connection.setAutoCommit(false) false代表关闭自动提交事务 true代码自动提交事务
* connection.commit(); 没有异常 手动提交事务
* connection.rollback(); 存在异常 手动回滚事务
*
*/
public class JDBCTest09 {
public static void main(String[] args) throws SQLException {
//创建数据库连接对象
Connection connection=null;
PreparedStatement preparedstatement=null;
int count=0;
try {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
connection= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai",
"root","123456");
//将JDBC的事务自动提交机制更改为手动提交
connection.setAutoCommit(false);
//获取预编译数据库对象,并编译SQL语句
String sql="UPDATE t_act SET BALANCE=? WHERE ACTNO=?";
preparedstatement=connection.prepareStatement(sql);
//给占位符传值
preparedstatement.setDouble(1,10000);
preparedstatement.setInt(2,111);
//执行sql语句
count=preparedstatement.executeUpdate();
//制造异常 程序中断执行. 执行后发现前面的SQL语句生效了,更改了账户中的余额,但是另一个账户的余额确没有增加,造成数据丢失。
//String str=null;
//str.toString();
//再次给占位符传值,给第二个账户赋值(转账)
preparedstatement.setDouble(1,10000);
preparedstatement.setInt(2,222);
//再次执行SQL
count+=preparedstatement.executeUpdate();
//输出 如果count==2,那么代表执行了两次sql
System.out.println(count==2?"转账成功":"转账失败");
//程序走到这里,说明以上程序没有异常,事务结束,手动提交事务
connection.commit();
} catch (ClassNotFoundException | SQLException e) {
// 如果程序执行到这里说明存在异常,那么数据就需要回滚,回滚事务,以保证数据的安全性。
if(connection!=null){
connection.rollback();
}
e.printStackTrace();
}finally {
// 释放资源
if(preparedstatement!=null){
try {
preparedstatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}