1. 事务概念
1.1. 事务(Transaction)其实指的是一组操作, 里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功, 那么都算失败。所有的数据都回归到最初的状态。
2. 为什么要有事务?
2.1. 为了确保逻辑的成功。例子: 银行的转账。
3. 事务的特性
3.1. 原子性(Atomicity): 指的是事务是一个不可分割的工作单位, 事务中的多个操作要么都发生, 要么都不发生。
3.2. 一致性(Consistency): 指的是事务执行前后, 数据的完整性没有被破环。比如A向B转了钱, 转账前后钱的总数不变。
3.3. 隔离性(Isolation): 指的是多个用户并发访问数据数据库时, 一个用户的事务不能被其他用户的事务所干扰, 多个并发事务之间的数据相互隔离。比如事务A和事务B都修改同一条记录, 这条记录就会被重复修改或者后者会覆盖前者的修改记录。
3.4. 持久性(Durability): 指的是事务完成后, 事务对数据库的更新被保存到数据库, 其结果是永久的。
4. 查询和关闭事务的自动提交
5. 事务的操作步骤
5.1. 开启事务: start transaction。
5.2. 提交事务commit, 数据将会写到数据库。
5.3. 回滚事务rollback, 数据回滚到最初的状态。
5.4. 事务只是针对连接对象, 如果再开一个连接对象, 那么默认是自动提交的。
6. 创建一张account表, 并插入2条数据。
7. 演示事务
8. 事务例子
8.1. 新建一个JDBC_Transaction工程, 使用我们之前的JDBCUtil.java和jdbc.properties属性文件
8.2. 事务
package com.lywgames.myjdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.lywgames.util.JDBCUtil;
public class MyJDBC {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();
// 1.关闭事务自动提交
conn.setAutoCommit(false);
// 2.扣除用户1的钱
ps = conn.prepareStatement("update account set money = money - ? where id = ?");
ps.setInt(1, 100);
ps.setInt(2, 1);
ps.executeUpdate();
// 3.抛一个除数为0异常
int v = 2 / 0;
JDBCUtil.closeSt(ps);
// 4.给用户2加钱
ps = conn.prepareStatement("update account set money = money + ? where id = ?");
ps.setInt(1, 100);
ps.setInt(2, 2);
ps.executeUpdate();
// 5.提交事务
conn.commit();
} catch (SQLException e) {
try {
// 6.回滚事务
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
JDBCUtil.release(conn, ps, rs);
}
}
}
8.3. 运行前查看id为1和2的钱分别是2000和1000
8.4. 运行出错, id为1和2的钱还是2000和1000
8.5. 注释掉会抛异常的代码
8.6. 运行后没有出错, id为1的人的钱变为1900, id为2的人的钱变为1100