事务一般满足 ACID:
- 原子性(Atomicity):事务不可分割,要么都执行,要么都不执行
- 一致性(Consistency):事务前后数据完整性必须一致
- 隔离性(Isolation):不同事务之间不能互相干扰
- 持久性(Durability):事务一旦提交,操作就是永久性的
事务间的影响
- 脏读:事务读取另一个事务未提交的数据
- 不可重复读:在一个事务内读取某一行数据,多次读取结果不同
- 幻读:在同一个事务内前后读取到的数据条数不一致
不可重复读 和 幻读不算异常,有些场景下不影响结果
隔离级别
- 读未提交(Read uncommitted):啥都无法保证
- 读已提交(Read committed):可避免脏读
- 可重复读(Repeatable read):可避免脏读、不可重复读、允许幻读
- 序列化(Serializable ):都能避免
隔离级别相关 sql :
// 查询当前客户端隔离级别
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;
// 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL read uncommitted;
SET SESSION TRANSACTION ISOLATION LEVEL read committed;
SET SESSION TRANSACTION ISOLATION LEVEL repeatable read;
SET SESSION TRANSACTION ISOLATION LEVEL serializable;
// 开启事务
start transaction;
// 提交事务
commit;
// 回滚事务
rollback
JAVA 代码 JDBC 相关代码:
// 关闭事务
connection.setAutoCommit(false);
InnoDB 事务默认是开启的,我们任何操作都会被看做独立事务来处理,默认隔离级别为可重复读