1. 程式人生 > 其它 >consistent read一致性讀,DDL DML DCL

consistent read一致性讀,DDL DML DCL

技術標籤:mysqlconsistent readDDLDMLDCL

一致性讀的概念consistent read

mysql 的讀操作是快照讀,也就是說,在讀操作執行的時候是某一個時刻的資料內容,不管其他的事務在做什麼,原始資料會依據undo log 進行重新組織。一致性讀是用來避免其他事務引起的鎖等待問題。
一致性讀能夠看到 某一時刻提交的事務做出的更改,看不到之後或者uncommitted的事務。但是有一個例外,就是事務本身中進行的statements導致的的changes是能夠被本身所看見的,(這一點不管是RC 還是RR 下都是這樣)可以自己動手試一下。
如果隔離級別是RR(REPEATABLE READ)所有的讀操作的結果只能是第一次在事務中執行的那樣,也就是說,不管你執行幾次read操作,始終是和第一次一樣的,也就是所說的可重複讀。

一致性讀是innodb RC 和RR 下預設Select語句的模式,一致性讀不會給table加鎖,因此其他事務能夠同時進行這些table的修改。
假設你正在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”.