1. 程式人生 > 實用技巧 >MySQL——安全性語言及多使用者事務管理

MySQL——安全性語言及多使用者事務管理

一、MySQL的使用者管理

1.使用者介紹

在MySQL中,會涉及到使用者的連線登入的內容,這些內容都存在在MySQL的mysql資料庫user表中,在這個表中,涉及到這個使用者的許可權問題,包括以下內容。

1.是否可讀資料庫
2.是否可以讀寫資料庫
3.有哪些資料庫的操作許可權

通常會在資料庫中,有一個超級許可權使用者預設為root

2.使用者操作

2.1增加使用者

SQL語法

CREATE USER 使用者 [IDENTIFIED BY ‘password’];
其中使用者=’使用者名稱’@’主機名’

例子

CREATE USER 'ALEX'@'LOCALHOST' 
IDENTIFIED  
BY '123456';

2.2增加許可權

SQL語法

GRANT privi_type ON table_name TO 使用者;
# Privi_type: select ,delete, update ,insert, create, drop,usage   all…..
# with grant option 表示允許該使用者將許可權授予其他使用者
# 注:若指定密碼,則原密碼將會被覆蓋,如果許可權授予一個不存在的使用者,則MySQL會自動建立這個使用者,但必須為該使用者指定密碼。
# 使用者='使用者名稱'@'主機名'

2.3刪除使用者

SQL語句

DROP USER 使用者;

其中使用者:使用者=’使用者名稱’@’主機名’

2.4回收許可權

使用REVOKE命令可以回收授予的許可權,語法格式如下:
REVOKE priv_type ON {表名|資料庫名} FROM 使用者;
或REVOKE ALL PRIVILEDGES, GRANT OPTION FROM 使用者;
注:只有擁有當前資料庫全域性CREATE或者UPDATE許可權的使用者才能使用REVOKE命令。
例如:
revoke update on dbst.student from ALEX@localhost;
revoke ALL ON DBST.*  from  ALEX@LOCALHOST

2.5修改使用者

UPDATE MYSQL.USER
SET PASSWORD= PASSWORD(‘新密碼’) WHERE USER=‘使用者’; 例如: UPDATE MYSQL.USER SET PASSWORD=PASSWORD(‘123’) WHERE USER=‘ALEX’ AND HOST=‘LOCALHOST’; flush privileges; //重新整理許可權(必須步驟) update mysql.user set authentication_string='123' where user=‘alex' and host='loacalhost';

2.6查詢使用者

# 從mysql中選取資料
select  * from user

2.7檢視許可權

# 使用下面的指令檢視使用者許可權
show grants for  ‘alex’@’localhost’;

二、MySQL的事務管理

1.事務概念

事務是由作為一個單獨單元的一個或多個SQL語句組成。事務具有以下的幾個特性(ACID)

ACID原則(事物具有的特性)
A:原子性(Atomicity):事務是一個或多個行為捆綁在一起組成一個單獨的工作單元,事務中的動作要麼都發生,要麼都不發生.
C:一致性(Consistent):即在事務開始之前和結束之後,資料庫的完整性約束沒有被破壞.
I:隔離性(Isolation):指的是在併發環境中,事務之間互相影響的程度(即併發事務間資料的可見程度).由併發事務所做的修改必須與任何其他併發事務所做的修改隔離.
D:永續性(Durability):一旦事務完成,事務的結果應該持久化,用來保證即使系統崩潰也不會破壞事務的結果.

2.併發控制

1.丟失修改:兩個不同的事務同時獲得了相同的資料,又都對這個資料進行了修改,那麼先提交的事務的更新就會被後提交事務的更新覆蓋掉。
2.髒讀(未提交讀) :一個事務正在訪問資料,而其他事務正在更新該資料,但尚未提交,此時會發生髒讀問題,即第一個事務所讀取的資料是“髒”的。
3.不可重複讀:在一個事務內多次讀同一資料,在該事務還沒有結束時,另外的事務也訪問該資料並對其做修改,從而導致第一個事務兩次讀取的資料不一樣
4.幻讀:有兩種情況
(1):事務T1按一定條件從資料庫中讀取了某些資料記錄後,事務T2刪除了其中部分記錄,當T1再次按照相同條件讀取資料時,發現某些記錄神祕的消失了.
(2):事務T1按一定條件從資料庫中讀取了某些資料記錄後,事務T2插入了一些記錄,當T1再次按照相同條件讀取資料時,發現多了一些記錄.

3.四種隔離級別

四級隔離級別:定義使用者之間隔離和互動的程度
1.讀未提交(read uncommitted):可以讀到其他事務還沒有提交的資料,但不允許丟失修改,會導致大量資料變化。一級封鎖協議
2.讀已提交(read committed):可以看到其他事務新增的新紀錄,而且其他事務對現存記錄做出的修改一旦被提交,也可以看到,避免丟失修改和髒讀。二級封鎖協議
3.可重複讀(repeatable read):當前在執行的事務的變化無法被看到,同一事務中執行select數次結果都相同,避免丟失修改、髒讀和不可重複讀。增強的二級封鎖協議
4.可序列化(serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,不能併發執行,避免所有併發控制問題。三級封鎖協議

注:MySQL預設為repeatable read隔離級別

三、事務控制

1.控制語句

MYSQL事物控制語句
begin   //開始一個事物
commit  //提交一個事物
rollback  //回滾一個事物

Set autocommit ={0|1}    //為0是不自動提交, 為1是自動提交

2.事務安全

在pymysql中,如果不使用commit提交新增的事務,資料庫中會出現這個資料,但是在此使用就會出現bug,因此pymysql在一定的情況下,屬於執行緒不安全。