consistent read一致性讀,DDL DML DCL
阿新 • • 發佈:2021-01-08
技術標籤:mysqlconsistent readDDLDMLDCL
一致性讀的概念consistent read
mysql 的讀操作是快照讀,也就是說,在讀操作執行的時候是某一個時刻的資料內容,不管其他的事務在做什麼,原始資料會依據undo log 進行重新組織。一致性讀是用來避免其他事務引起的鎖等待問題。
一致性讀能夠看到 某一時刻提交的事務做出的更改,看不到之後或者uncommitted的事務。但是有一個例外,就是事務本身中進行的statements導致的的changes是能夠被本身所看見的,(這一點不管是RC 還是RR 下都是這樣)可以自己動手試一下。
如果隔離級別是RR(REPEATABLE READ)所有的讀操作的結果只能是第一次在事務中執行的那樣,也就是說,不管你執行幾次read操作,始終是和第一次一樣的,也就是所說的可重複讀。
假設你正在RR的隔離級別下,你執行了一條Select語句,InnoDB會根據你查詢的那一個時刻進行query。如果另一個事務在這個時間點之後,刪除了一個row並且commit了,你不會看到這個行被刪除了,插入和刪除也是類似的。
# 建表語句
create table demo1
(
id int auto_increment primary key,
name varchar(20),
phone varchar(11 )
) engine = innodb;
#看一眼隔離級別
show variables like '%isolation';
transaction_isolation,REPEATABLE-READ
session1 session2
start transaction; start transaction ;
select * from demo1;(0行輸出)
insert into demo1 values (1,'xx','1111');
select * from demo1; #輸出(1,xx,1111)也就是說能夠看到自己所做的changes。
select * from demo1;(0輸出)
commit;
select * from demo1;(0輸出)
delete from demo1 where id = 1;(影響到一行)#說明另一個事務提交之後,雖然select不到,但是能夠刪除這一行的!*****精華處在這
commit;
DDL DML DCL
- DDL,Data definition language,一系列的SQL語句用來操作資料庫本身的而不是單個的table。包括CREATE, ALTER, and DROP statements。Also includes the TRUNCATE statement, because it works differently than a DELETE FROM table_name statement, even though the ultimate effect is similar.DDL語句自動提交當前的事務,它們不能夠被回滾。
- DCL 資料庫控制語言,用來管理許可權的,比如GRANT和REVOKE;
- DML 資料庫操作語言,執行insert,update,delete操作。Select 有的時候也被當做是DML語句,因為Select…for update 也會像insert 一樣會加鎖。DML語句在事務的context中執行,所以它們的影響能夠被提交揮著回滾。
consistent read和DDL的關係
一致性讀並不會在DDL語句中起作用。
- 一致讀不會在DROP TABLE中起作用,因為MYSQL不會使用一個已經被DROP掉的table,InnoDB 破壞了這個table
- 一致性讀也不會在ALTER TABLE的操作中起作用,會出現下面的錯誤。
ER_TABLE_DEF_CHANGED, “Table definition has changed, please retry transaction”.