數據庫隔離級別(代碼級)

數據庫隔離級別有四種

讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
串行化(serializable)

 1.讀未提交(read-uncommitted),事務A可以讀取事務B中未提交的數據

事務A設置事務隔離級別

mysql> set session transaction isolation level read uncommited;
mysql> start transaction;
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123      |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.19 sec)

B事務使用相同的事務隔離級別

mysql> set session transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123      |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.03 sec)

mysql> update users set password=123456 where id=1;

A事務,在事務中重新查詢

mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123456   |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)
2.不可重複讀(read-committed)
事務A只能讀取到事務B已提交的數據;

事務A

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123      |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)

事務 B

mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> update users set password=12345 where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 12345    |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.03 sec)

事務A

mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123      |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)

mysql> 

事務B提交後A進行查詢,證明了A只能查到B提交完成的事務;

mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 12345    |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)

mysql> 
3. 可重複讀(repeatable-read)
事務A在開啓事務後讀取到的數據始終是一致的,無論事務B是否修改數據;

事務A

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

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

mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 12345    |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)
--事務B修改後重新查詢
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 12345    |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)

mysql> 

事務B修改數據並提交事務,事務A查到數據始終一致,是B事務修改前的數據

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

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

mysql> update users set password=1111 where id=1;
Query OK, 1 row affected (0.34 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select *from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 1111     |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.03 sec)

mysql> 
4. 串行化(serializable)
事務B對數據進行update;事務A只能等待事務B提交後才能進行修改;
通過時間我們可以看到事務A用力了25秒,那麼這25秒是事務B在修改數據但是沒有提交的時間

事務A查詢語句

mysql> update users set password=11111 where id=1;
Query OK, 1 row affected (25.40 sec)
Rows matched: 1  Changed: 1  Warnings: 0

事務B

mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 1        |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.06 sec)

mysql> update users set password=123 where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | zhangsan | 123      |
|  2 | lisi     | 123456   |
|  3 | wangwu   | 123456   |
+----+----------+----------+
3 rows in set (0.04 sec)

以上就是事務的四種隔離級別的具體在數據庫中的表現啦,請大家點個贊和收藏喲!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章