mysql隔离级别

1.查看mysql的事务级别(不同版本命令不同)

//查看数据库版本
mysql> select @@version;    
+-----------+
| @@version |
+-----------+
| 8.0.12    |
+-----------+
1 row in set (0.01 sec)


//查看数据库隔离级别
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.02 sec)


//查看数据库是否是自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.03 sec)


//将数据库 自动提交 去掉
mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)


//再次查看事务是否自动提交
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.04 sec)


现在来看看MySQL数据库为我们提供的四种隔离级别:

  1.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

  2. Repeatable read (可重复读):可避免脏读、不可重复读的发生。

  3. Read committed (读已提交):可避免脏读的发生。

  4. Read uncommitted (读未提交):最低级别,任何情况都无法保证。



//设置数据库的隔离级别
mysql> set transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)


//开始事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)


//设置数据库的隔离级别
set session transaction isolation level read committed;
set session transaction isolation level read uncommitted;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

2 查看各种隔离级别带来的影响

2.1 可重复读 的隔离级别

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.01 sec)

** 幻读现象: **
是指 有两条数据,有两个事务,这两个事务是都在运行中的,不能一个 都commit了,另一个还未 开启。其中一个事务将数据删除一条,已经提交,但是由于第二个事务未commit,其还是能看到两条数据,这样就是产生幻读现象。

事务1:                                                                 


mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 小明 |
|  2 | xiii |
+----+------+
2 rows in set (0.01 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from test where id = 1;
Query OK, 1 row affected (0.02 sec)

mysql> commit;
Query OK, 0 rows affected (0.06 sec)					


  事务2:				
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+----+------+
| id | name |
+----+------+
|  1 | 小明 |
|  2 | xiii |
+----+------+
2 rows in set (0.01 sec)

不可重复读 现象

这样 在 数据库隔离级别都是 read committed的时候,两个事务同时开启。
如果 在事务A中,更新了一条数据,未commit,事务B看不到 数据变化。
如果 事务A commit,事务B中也能看到数据的变化,这样如果A又更改又提交,则事务B中的数据反复 变化,就是 不能够重复读,每次读的
数据都不一致。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值