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... (具体参考文档)

参考:

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