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中的数据反复 变化,就是 不能够重复读,每次读的
数据都不一致。