1:事务的基本要素(ACID)
A (atomicity) 原子性
# 默认 mysql 开启主动提交 将对应 sql 主动 commit,否则须要人工提交
show VARIABLES like 'autocommit'
C (consistency) 连贯性
protect data from crashes
I (Isolation) 隔离性
保障同一时间段 多个事务对同雷同数据的查问更新的操作 仍然放弃牢靠连贯(彼此隔离)
D (Durability) 持久性
2:概念阐明
脏读(dirty read)
事务 A 读取了事务 B 更新的数据,而后 B 回滚操作,那么 A 读取到的数据是脏数据(事务读取了另外一个事务中没有提交的数据)
不可反复读
在同一个事务中,屡次读取同样的数据返回不同的后果
幻读
3:隔离级别
1:读未提交(READ UNCOMMITTED)
2:读提交(READ COMMITTED)oracle 默认
3:可反复读(REPEATABLE READ)mysql 默认
能够保障其余事务的对数据的批改 (曾经提交) 不会影响以后事务(以后事务读取同一个数据应该始终统一),然而对于其余事务插入的数据能够读到(幻读)
4:串行化(SERIALIZABLE)
从上往下,隔离强度逐步加强,性能逐步变差
事务隔离级别 | 脏读 | 不可反复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 存在 | 存在 | 存在 |
读提交(read-committed) | 否 | 存在 | 存在 |
可反复读(repeatable-read) | 否 | 否 | 存在 |
串行化(serializable) | 否 | 否 | 否 |
# 演示基于 mysql5.7
# 查看隔离级别 默认为 REPEATABLE READ
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set
mysql> show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set
# 批改以后 session 隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
读未提交(read-uncommitted)
SELECT statements are performed in a nonlocking fashion, 因为不加锁,性能最好。
4:补充
查看运行中的事务
mysql> select * from information_schema.innodb_trx;
返回字段阐明
- trx_id: 事务 id
- trx_state:事务状态
- trx_started:事务开始工夫
- trx_requested_lock_id:事务以后正在期待锁的标识(varchar 类型)
- trx_wait_started:开始等待时间
- trx_weight:事务权重
- ….
- https://dev.mysql.com/doc/ref… (具体参考文档)
参考:
- https://dev.mysql.com/doc/ref…
- https://dev.mysql.com/doc/ref… (批改事务隔离级别)