標籤:date user 開始 使用者資訊 地址 而不是 語句 不執行 基本實現
一、資料控制語言(DCL)
1、資料控制,其實就是“分配許可權”——就涉及到使用者。
2、則主要就是2個問題:
使用者管理:
許可權分配:有哪些許可權。
1、mysql中的許可權
(1)mysql中,許可權是系統內定的一些“名詞”(單詞),大約30個,每個許可權表示“可以做什麼工作”。
(2)則分配許可權就是相當於讓某個使用者可以做哪些工作。
(3)主要許可權如下:
2、mysql中的使用者
mysql中的使用者資訊都儲存在系統資料庫mysql的user表中:
(1)建立使用者
文法形式:
create user ‘使用者名稱’@’允許其登入的地址’ identified by ‘密碼’;
說明:
1,建立的使用者需同時指定該使用者可以在哪個地址進行登入。
其中“%”代表“任何地址”。
2,使用者建立之後,自動在mysql的user表中添加了一條記錄,但該使用者還沒有許可權。
(2)刪除使用者
drop user ‘使用者名稱’@’允許其登入的地址’;
(3)修改使用者密碼 登入進去
①修改自己密碼: set password = password(‘新密碼’);
②修改他人密碼(必須有修改許可權):
set password for ‘使用者名稱’@’允許其登入的地址’ = password(‘新密碼’);
3、許可權分配
(1)增加許可權:
grant 許可權名1,許可權名2, .... on 資料庫名.對象名 to ‘使用者名稱’@’允許其登入的地址’ identified by ‘密碼’;
說明:
①許可權名就是:’select’, ‘update’, ‘delete’,等等。其中ALL 表示“所有許可權”,或all privileges也一樣
②對象名:就是一個資料庫中“裝”的東西,表是最常見的,也可以是視圖,預存程序,儲存函數等。 now()
其中:*.*表示所有資料中的所有對象
某資料庫名.*表示該資料庫中的所有對象——這個商業上常用。
③identified by ‘密碼’用於給一個使用者在此時修改密碼,不寫也可以,那就不修改密碼。
④但同時該語句也可以建立使用者(如果不存在),但此時identified by ‘密碼’必須寫。
(2)刪除許可權
revoke 許可權名1,許可權名2, .... on 資料庫名.對象名 from ‘使用者名稱’@’允許其登入的地址’ ;
表示從某個使用者身上“取消”某些許可權(也許還保留了其他許可權)。
二、事務控制語言(DTL)
1、什麼是事務
通常,在此之前,我們說,一條語句使用一個分號(;)來結束,並得到執行。那麼我們說,這個“一次性執行”的過程,可以稱為“一個事務”。
簡單來說,“一條sql語句,就是一個事務”。則:資料庫(自然包括mysql資料庫)中的事務,是指,可以將“多條語句”的執行,當作“一條語句”來看到的一種內部機制。
即:“事務”是一種可以保證“多條語句一次性執行完成”或“一條都不執行”的機制。
2、為什麼需要事務?
看一個實際應用需求(銀行存款):表名cunkuan
id |
賬戶名 |
存款 |
1 |
test1 |
1000 |
2 |
test2 |
5000 |
3 |
test3 |
3000 |
現在,test1突然需要一筆錢,買iPhone8,向test2借錢4000。
銀行轉賬:
第一步: update cunkuan set 存款=存款-4000 where id=2;
第一步做完,突然斷電了!
第二步: update cunkuan set 存款=存款+4000 where id=1;
則如果沒有事務,就可能發生這種事情(慘案)。
如果有了事務,則就可以避免該事情。
事務可以看作是一個“容器”,將多條語句,放入該容器,最後,只要一個命令列,來決定其中的所有語句是否“執行”。
3、事務的特點
(1)原子性:一個事務中的所有語句,應該做到:要麼全做,要麼一個都不做;
(2)一致性:讓資料保持邏輯上的“合理性”,比如:一個商品出庫時,既要讓商品庫中的該商品數量減1,又要讓對應使用者的購物車中的該商品加1;
(3)隔離性:如果多個事務同時並發執行,但每個事務就像各自獨立執行一樣。
(4)持久性:一個事務執行成功,則對資料來說應該是一個明確的硬碟資料更改(而不僅僅是記憶體中的變化)。
4、事務的基本實現流程:
(1)聲明事務開始:start transaction;
(2)設定多條要執行的具體語句,比如:insert, update, delete, select。。。其實就是執行,只是這些執行的語句,並不“生效”——其只是記憶體狀態下的執行,而不是物理狀態的執行。
(3)判斷是否需要執行該些語句:
if( 判斷是否有錯誤){
//執行——才針對執行了物理性改變——即生效。
commit;
}
eslse{
//復原——不執行任何語句。
rollback;
}
(4)判斷是否有錯誤通常分這兩種環境:
①如果是cmd中,直接觀察是否出錯。
②如果是php程式中,那就需要使用 mysql_error()函數來判斷是否有錯。
下來來使用事務完整轉賬這件事情(假設為cmd模式):
start transaction;
#第一步:
update cunkuan set 存款=存款-4000 where id=2;
#第一步做完,突然斷電了?
#第二步:
update cunkuan set 存款=存款+4000 where id=1;
則如果這兩條語句都沒有錯誤,就可以:
commit;
但,如果其中發生了錯誤,則可以:
rollback;
MySQL-資料與實務控制語言