1. 事务
(1) 概念
(2)事务的四大特性(ACID)
2. JDBC操作事务
package com.jing.jdbc;
import com.jing.utils.JDBCUtils;
import java.sql.*;
public class TestTransaction01 {
public static void main(String[] args){
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtils.getConnection();
/*
由事务的原子性可知:一个事务中的SQL语句,要么都成功,要么都失败
在提交之前出现异常,那么已经成功执行的SQL语句都会被自动回滚,效果就是都执行失败,即都未执行
*/
// 关闭事务自动提交,默认会开启事务
connection.setAutoCommit(false);
String sql10 = "SELECT * FROM account where NAME = 'lucy'";
statement = connection.prepareStatement(sql10);
resultSet = statement.executeQuery();
if(resultSet.next()){
System.out.println("转账之前:money=" + resultSet.getObject("money"));
}
String sql1 = "UPDATE account set money = money - 500 where NAME = 'lucy'";
statement = connection.prepareStatement(sql1);
statement.executeUpdate();
String sql11 = "SELECT * FROM account where NAME = 'lucy'";
statement = connection.prepareStatement(sql11);
resultSet = statement.executeQuery();
if(resultSet.next()){
System.out.println("转账之后:money=" + resultSet.getObject("money"));
}
String sql2 = "UPDATE account set1 money = money + 500 where NAME = 'Tom'";
statement = connection.prepareStatement(sql2);
statement.executeUpdate();
//提交事务,提交之前对数据库的操作都不会生效
connection.commit();
} catch (SQLException e) {
// 捕捉到异常
System.out.println("捕捉到异常:" + e);
try {
// 回滚只能用在手动提交模式中
// 作用:提交之前发现异常,可以执行rollback()方法回滚已经执行的SQL语句
// 由于未提交,异常之前的执行的语句会被自动回滚,所以可以不写connection.rollback();
// 自动回滚一般发生在释放资源之前,为了保持数据的一致性,所以建议手动释放资源,并在此之前检测到异常时显式地回滚事务
connection.rollback();
System.out.println("已回滚");
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
String sql3 = "SELECT * FROM account where NAME = 'lucy'";
statement = connection.prepareStatement(sql3);
resultSet = statement.executeQuery();
if(resultSet.next()){
System.out.println("发生异常回滚之后:money=" + resultSet.getObject("money"));
}
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
JDBCUtils.release(connection,statement,null);
}
}
}