數據庫隔離級別有四種
讀未提交(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)
以上就是事務的四種隔離級別的具體在數據庫中的表現啦,請大家點個贊和收藏喲!