什么是事务?
事务是指数据库中一系列数据库语句的集合,在mysql中,通常以start transaction;
作为一个事务的语法开头,commit;
作为事务的结尾,一则事务要么全部执行,要么全部不执行。我们可以将事务作为数据库中一个逻辑执行单元(不可分割)来理解。类似于操作系统的中将一条指令作为不可分割的单位。事务的出现主要被用来解决数据库在并发场景下存在的数据不一致性问题。
事务的性质
ACID:
- Atomic:(原子性):不可分割的特性
- Concurrent(一致性):状态转移的一致性
- Isolation(独立性):不同事务之间的状态是独立的
- Duration(持久性):事务执行完成后,状态会被永久保持在磁盘中(如果是mysql数据库)
事务之间的隔离等级
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | ✅ | ✅ | ✅ |
read committed | ❌ | ✅ | ✅ |
repeatable read | ❌ | ❌ | ✅ |
serializable | ❌ | ❌ | ❌ |
在mysql中,我们通常使用select @@ioslation_transaction;
来查询当前数据库的隔离级别。mysql默认使用repeatable read
作为默认属性。
使用语句set [session|global] transaction isolation level {上述四种中的一种};
来设置隔离级别。
当隔离级别为read uncommitted
, 两个客户端并发执行事务,客户端A先查询两次,客户端B在客户端A查询两次中间更新了数据库,则会导致客户端A两次查询结果不一致,这称之为脏读。
当隔离级别为read committed
,两个客户端并发执行事务,客户端A查询两次,客户端B在客户端A查询两次中间更新了数据库,如果没有执行committed;
语句,客户端A两次查询结果一致,若执行了committed;
语句,则客户端A两次查询结果可能不一致,这称之为不可重复读。
当隔离级别为repeatable read
,两个客户端并发执行事务,客户端A查询两次,客户端B在客户端A查询两次中间更新了数据库插入某一个主键I,客户端A两次查询结果一致,若执行了committed;
语句,客户端A如果插入I,会失败,这称之为幻读。