mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试
Mysql下InnoDB的可重復讀的事務測試
### 背景:
* mysql版本:Server version: 5.1.71
* 操作系統:CentOS 6.5 X64
* 事務隔離級別:不可重復讀
### 實驗前的準備:
mysql> use test;
mysql> create table test_table(id int primary key, name varchar(255)) ENGINE=InnoDB;
mysql> insert into test_table value(1, 'lily');
mysql> create table test_table2(id int primary key, name varchar(255)) ENGINE=InnoDB;
mysql> insert into test_table2 value(1, 'lucy');
### 實驗1
問題:事務從什么時候開始?
測試兩邊同事開啟事務,只在終端A中進行update操作,提交完成之后,在終端B中觀察
步驟????????????????????? 終端A??????????????????????????????????????? 終端B
1??????? mysql> set autocommit = off;????????????????????? mysql> set autocommit = off;
2??????? mysql> update test_table set name = 'lucy';
3??????? mysql> commit;
4????????????????????????????????????????????????????????? mysql> select * from test_table;
+----+--------+
| id | name?? |
+----+--------+
|? 1 | lucy?? |
+----+--------+
1 rows in set (0.00 sec)
在終端B中直接可以看到終端A所做的修改,說明事務并不是從命令"set autocommit = off"執行時就開始;
還原影響數據:
mysql> update test_table set name = 'lily';
mysql> commit;
只在終端A中進行更新操作,同時在終端B中對庫中的任意一個表進行一個操作,終端A提交之后,觀察終端B中的數據;然后在終端B中執行commit之后,再次查看終端A中修改的數據。
步驟????????????????????? 終端A??????????????????????????????????????? 終端B
1??????? mysql> rollback;????????????????????????????????? mysql> rollback;
2??????? mysql> update test_table set name = 'lucy';?????? mysql> select * from test_table2;
3??????? mysql> commit;
4????????????????????????????????????????????????????????? mysql> select * from test_table;
+----+--------+
| id | name?? |
+----+--------+
|? 1 | lily?? |
+----+--------+
1 row in set (0.00 sec)
mysql> commit;
mysql> select * from test_table;
+----+--------+
| id | name?? |
+----+--------+
|? 1 | lucy?? |
+----+--------+
1 row in set (0.00 sec)
這里啟動了事務,說明事務是以第一條SQL時開始的
### 實驗2
問題:InnoDB在不可重復讀隔離級別下,有沒有幻讀情況
還原影響數據:
mysql> update test_table set name = 'lily';
mysql> commit;
步驟????????????????????? 終端A??????????????????????????????????????? 終端B
1??????? mysql> rollback;????????????????????????????????? mysql> rollback;
2??????? mysql> insert into test_table value(2, 'lucy');?? mysql> select * from test_table2;
3??????? mysql> commit;
4????????????????????????????????????????????????????????? mysql> select * from test_table;
+----+--------+
| id | name?? |
+----+--------+
|? 1 | lily?? |
+----+--------+
1 row in set (0.00 sec)
mysql> rollback;
mysql> select * from test_table;
+----+--------+
| id | name?? |
+----+--------+
|? 1 | lily?? |
|? 2 | lucy?? |
+----+--------+
2 rows in set (0.00 sec)
這里沒有存在幻讀的情況,說明InnoDB對幻讀有處理。
### 實驗3
問題:同事開啟兩個事務A和B,事務A中插入一條記錄R,事務B中插入另一條記錄R2,R2的主鍵與記錄R相同,如何處理?
還原影響數據:
mysql> delete from test_table where id = 2;
mysql> commit;
步驟????????????????????? 終端A??????????????????????????????????????? 終端B
1??????? mysql> rollback;????????????????????????????????? mysql> rollback;
2??????? mysql> insert into test_table value(2, 'lucy');?? mysql> select * from test_table2;
3??????? mysql> commit;
4????????????????????????????????????????????????????????? mysql> insert into test_table value(2, 'lucy');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
這種情況下,會報錯。
### 實驗4
問題:不同事務更新同一條記錄。
步驟????????????????????? 終端A?????????????????????????????????????? ??? ??? ?終端B
1??????? mysql> rollback;???????????????????????????????? ??? ??? ??? ?mysql> rollback;
2??????? mysql> update test_table set name = 'lily2' where id = 1;
3?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? mysql> update test_table set name = 'lily3' where id = 1;
... 卡住 ... 在超過一定時間之后報錯:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
兩個事務在編輯同一條數據時,先編輯的事務會將該記錄鎖定,或編輯的事務會等待一定時間,如果一定直接內仍然被鎖定則報錯。
總結
以上是生活随笔為你收集整理的mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql存储过程套嵌_mysql存储过
- 下一篇: python动态绘图并保留之前绘图_[转