[toc]
Lecture18-事务-概念
一、事务要解决的问题
多条SQL语句全部执行成功,才能完成一个完整的业务逻辑,例如:
- 转账:A账号转账200元--->B账号
- 下单:商品销售了5件,单价100元
- 销量增加5
- 库存减少5
- 买家用户资金账号余额减500元
- 保存订单信息
- 保存订单详情信息
- ……
我们的目标是:当一个业务逻辑中包含多条增删改的SQL语句,那么这些SQL语句要么都成功,要么全部撤销,保证数据库中的数据始终都是正确的状态
二、事务ACID属性
-
A:原子性Atomicity
在一个业务逻辑中缺少任何一条SQL语句都构不成一个完整的业务逻辑
-
C:一致性Consistency
事务执行之前和事务执行之后,数据库中的数据都是正确的状态

-
I:隔离性Isolation
在并发环境下执行事务,为了让各个事务之间不会互相干扰,让事务在一定程度上彼此隔离
-
D:持久性Durability
事务提交之后,对数据的修改就永久的保存到硬盘上,不可撤销
三、事务隔离级别
1、并发问题
| 并发问题 | 描述 |
|---|---|
| 脏读 | T1读取了T2尚未提交的修改 然后T2回滚了 |
| 不可重复读 | T1内部第一次读取数据和第二次读取同一个数据,二者不相等 意味着T1执行过程中,有其它事务修改了数据 比脏读好的是:第二次读取到的数据是其他事务提交后的值 |
| 幻读 | T1执行过程中,数据库表中记录的数量发生了变化,感觉像是产生了幻觉 |
2、隔离级别
| 隔离级别 | 描述 | 解决问题 |
|---|---|---|
| 读未提交 | 当前事务可以读取其它事务尚未提交的修改 | 无 |
| 读已提交 | 当前事务只去读取其它事务已经提交的修改 | 脏读 |
| 可重复读 | 当前事务执行时,锁定数据,不允许其它事务操作 | 脏读 不可重复读 |
| 串行化 | 当前事务执行时,锁定整个数据库表,不允许其它事务操作 | 所有 |
四、事务的JDBC代码实现
- 编程式事务:我们自己动手,编写代码,实现事务功能
- 声明式事务:基于框架,通过配置或注解等方式,实现事务功能
try {
// 核心操作前
// 1、获取数据库连接
conn = JdbcUtils.getConnection();
// 2、开启事务(把事务自动提交关闭)
conn.setAutoCommit(false);
// 核心操作
orderService.saveOrder(order, user, cart);
// 核心操作成功之后:提交事务
conn.commit();
} catch (Exception e){
// 核心操作失败之后:回滚事务
conn.rollBack();
} finally{
// 核心操作结束之后:关闭数据库连接
conn.close();
}