mysql事务隔离级别

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... (具体参考文档)
查看事务锁信息

provides information about each lock that an InnoDB transaction has requested but not yet acquired

mysql> SELECT * FROM information_schema.INNODB_LOCKS;

返回字段说明

  • lock_id: 锁id
  • lock_trx_id: 锁事务id
  • LOCK_MODE: 锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。
  • lock_type: 锁的类型。RECORD 代表行级锁,TABLE 代表表级锁
  • lock_table: 被锁定的或者包含锁定记录的表的名称
  • lock_index: 当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL
  • lock_space: 当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL
  • lock_page: 当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL
  • lock_rec: 当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL
  • ...
  • https://dev.mysql.com/doc/ref...

参考:

你可能感兴趣的:(mysql数据库sql)