事务-事务特性(ACID)
原子性:事务中所有操作是不可分割的原子单位。
一致性:事务执行后,数据库状态与其他业务规则
隔离性:并发操作中,不同事务之间应隔离的,每个并发中事务不会相互干扰
持久性: 一旦事务提交成功,事务中所有数据必被持久化到库中。
MySQL中操作事务
- 默认下,每执行一条SQL与,都是一个单独事务
- 开启事务: start transaction
- 结束事务: commit 表示提交 rollback 表示回滚。
JDBC中操作事务
- 开启事务 :setAutoCommit(boolean) 【true默认一个SQL;false 开启事务,不自动提交事务】
- 结束事务: commit(); 提交事务 rollback(); 回滚事务
- 教科书式 格式:
try{
co.setAutoCommit(false);
.....
co.commit
}
catch(.....)
{
co.rollback();
}
事务隔离的并发读问题
1、有如下三种
- 脏读: 读取到另一个事务未提交的数据
- 不可重复读 两次读取不一致(读到另一个事务修改的记录)
- 幻读 两次读取不一致(读取到另一个事务插入的记录)
2、四大事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 备注 |
读未提交(read-uncommitted) | 是 | 是 | 是 | 不处理,无人用 |
不可重复读(read-committed) | 否 | 是 | 是 | MySQL默认 |
可重复读(repeatable-read) | 否 | 否 | 是 | MySQL默认 |
串行化(serializable) | 否 | 否 | 否 | 易出现死锁(不可用) |