《MYSQL數據庫》TCL語言和DCL語言

一、TCL語言的操作語法

有時候我們的一個需求(一個任務),可能會涉及到多個DML(增刪改)操作。那麼這一系列操作, 我們要看成一個整體,不可切割。如在一個員工系統中,某員工A的數據可能會存在多個表中,如基本信息表,業務信息表,郵箱信息表等。當我們想刪除此人的所有信息時,除了刪除這個人的基本信息外,還應該刪除與此人有關的其他所有信息,如郵箱,地址等等。這樣的操作會涉及到多個DML語句。那麼從開始執行到真正結束,就會構成一個事務(Transaction)。對於事務,我們要保證事務的完整性,不能分割。事務要麼成功, 要麼撤回(回到執行前),不能執行一部分就終止。

注意,只有DML操作時,纔會涉及到事務。而mysql數據庫在執行完每一個DML操作時,會默認commit; 可以使用start transaction來取消自動提交

commit:用於提交,表示事務成功結束。用於確認數據的更改,持久化。
rollback:用於回滾,回退到事務開始前。取消所有的DML操作。
savepoint: 設置事務的保存點,可以回退到指定的保存點。

事務有四個基本特徵,簡稱ACID.

(1) 原子性(Atomicity): 即事務要麼成功,要麼撤回,不可切割。
(2) 一致性(Consistency):事務開始前和結束後,要保證數據的一致性。如轉賬案例,轉賬前賬號A和賬號B的錢的總數爲10000。轉賬後賬號A和賬號B的錢的總數應該還是10000;
(3) 隔離性(Isolation):當涉及到多用戶操作同一張表時,數據庫爲會每一個用戶開啓一個事務。那麼當其中一個事務正在進行時,其他事務應該處於等待狀態。保證事務之間不會受影響。
(4) 持久性(Durability): 當一個事務被提交後,我們要保證數據庫裏的數據是永久改變的。即使數據庫崩潰了,我們也要保證事務的完整性。

關於事務的隔離性,尤爲重要。當多用戶(多線程)同時操作同一張表時,如果沒有隔離機制,可能會發生以下問題:

髒讀:事務A讀取了事務B剛剛更新的數據,但是事務B回滾了,這樣就導致事務A讀取的爲髒數據,我們稱之爲髒讀。
如公司某財務人員更新公司入賬報表時,在DML語句中的數字後少添加了一個0,但是未提交,然後喫飯,喫飯回來,發現錯誤,然後更正後做了提交。而在喫飯期間,老闆要求祕書查看一下報表,祕書看到的是少個0的數據。這就是髒讀。

 

不可重複讀:事務A讀取同一條記錄兩次,但是在兩次之間事務B對該條記錄進行了修改並提交,導致事務A兩次讀取的數據不一致。
它和髒讀的區別是,髒讀是事務A讀取了另一個事務B未提交的髒數據,而不可重複讀則是事務A讀取了事務B提交的數據。
多數情況下,不可重複讀並不是問題,因爲我們多次查詢某個數據時,當然要以最後查詢得到的結果爲主。但在另一些情況下就有可能發生問題,比如,老闆讓B和C分別覈對事務A操作的數據,結果可能不同,老闆是懷疑B呢,還是C呢?

 

幻讀:事務A在修改全表的數據,比如將字段age全部修改爲0歲,在未提交時,事務B向表中插入或刪除數據,如插入一條age爲25歲的數據。這樣導致事務A讀取的數據與需要修改的數據不一致,就和幻覺一樣。
幻讀和不可重複讀的相同點:都是針對於另外一個已經提交的事務而言。不同點:不可重複讀是針對於同一條記錄來說的(delete或update 同一條記錄),而幻讀是針對於一批數據來說的(insert)

 

事務的隔離機制有以下四種:

1、未提交讀(read uncommitted):就是不做隔離控制,可以讀到“髒數據”,可能發生不可重複讀,也可能出現幻讀。
2、提交讀(read committed):提交讀就是不允許讀取事務沒有提交的數據。顯然這種級別可以避免了髒讀問題。但是可能發生不可重複讀,幻讀。這個隔離級別是大多數數據庫(除了mysql)的默認隔離級別。
3、可重複讀(repeatable read):爲了避免提交讀級別不可重複讀的問題,在事務中對符合條件的記錄上"排他鎖",這樣其他事務不能對該事務操作的數據進行修改,可避免不可重複讀的問題產生。由於只對操作數據進行上鎖的操作,所以當其他事務插入或刪除數據時,會出現幻讀的問題,此種隔離級別爲Mysql默認的隔離級別。
4、序列化(Serializable),在事務中對錶上鎖,這樣在事務結束前,其他事務都不能夠對錶數據進行操作(包括新增,刪除和修改),這樣避免了髒讀,不可重複讀和幻讀,是最安全的隔離級別。但是由於該操作是堵塞的,因此會嚴重影響性能。

相關語法格式如下:

查看數據庫的當前隔離機制: select @@tx_isolation;
修改數據庫的隔離機制:set transaction isolation level 機制名稱 或者是 set tx_isolation='機制名稱';
如:set transaction isolation level read uncommitted 或者 set tx_isolation=‘read-uncommitted’;

二、DCL語言的操作語法

(1)創建用戶:create user username@ip identified by newPassword;

(2)修改密碼:alter user username@ip identified by newPassword;

(3)顯示用戶的權限:show grants for username@ip;

(4)授權語句:grant 權限1,權限2,...... on databaseName.* to username@ip;

DDL權限名稱: create、alter、drop、truncate 、create view 等等

DML權限名稱: insert、delete、update

DQL權限名稱: select

(5)撤銷權限:revoke 權限1,權限2,..... on databaseName.* from username@ip;

(6)刪除用戶:drop user username;

(7)權限生效語句:flush privileges;

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