1. 程式人生 > >MySQL——事務管理(重點)、檢視、使用者管理

MySQL——事務管理(重點)、檢視、使用者管理

在我們剛開始學習資料庫的時候就認識到了SQL的分類總共有三種DDL、DML、DCL,前面的學習已經用到了DDL、DML,今天的事務管理將用到DCL,資料控制語言,主要負責許可權管理和事務。
一、事務的概念
       事務就是一組DML語句組成的,這些語句在邏輯上存在相關性,它們要麼全部成功,要麼全部失敗。事務還規定不同的客戶端看到的資料是不同的。
在這裡插入圖片描述
對於事務設定的整個使用過程,我們剛開始需要開啟事務,等到開啟事務以後,我們就開始我們的工作,等一個工作結束後(一個時間段過去)我們就設定這個時間段的儲存點;然後繼續做接下來的工作,每一個時間段都是這樣,做完就設定儲存點,這樣的好處是如果在某個時間段發現有錯誤,那麼只需要回滾到上一個儲存點就可以了,不需要重新開始事務。
1.事務的基本操作
開始一個事務:start transaction;
建立一個儲存點:savepoint 儲存點的名字;
回到儲存點:rollback to 儲存點;
在這裡插入圖片描述


以上這個例子就是告訴我們,回到上一個儲存點就是儲存點以前的操作結果還在,但是儲存點後的操作結果沒有了。
2.事務操作的注意事項
(1)如果沒有設定儲存點也可以回滾,只是回滾到了事務開始的地方。直接使用rollback即可。
(2)如果一個事務已經被提交了那麼就不可以再回滾了。
(3)InnoDB支援事務,MyISAM不支援事務。
注意:commit之後事務就結束了,事務結束之後再回滾就沒有什麼用了。
3.事務的隔離級別
MySQL資料庫在同一時間很可能被很多的客戶端使用,當這麼多客戶端在同時使用時它們的操作肯定時不一樣的,每個人都希望只得到自己想要的效果,那麼資料庫提供了事務的隔離級別,這樣就使得不同的客戶端在進行操作的時候是相互獨立的。保證資料的一致性。
4.無隔離性的問題
(1)髒讀:一個事務在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,另外一個事務也訪這個訪問這個資料並且看到了這個修改後的資料就叫髒讀。
(2)不可重複度:當一個事務需要多次訪問資料,第一次訪問的時候是一個數據,當正準備訪問第二次資料的時候,又有另外一個事務來訪問這個資料並且做了修改,這時第一個事務訪問這個資料的第二次發現和第一次不一樣了,這樣的情況就叫不可重複讀。
(3)幻讀:當一個事務在訪問資料的時候對這個資料的所有進行了修改,另外一個數據也訪問這個資料並且修改了這個資料(插入一行新資料與原來的資料一樣),這樣第一個事務就可能會出現它修改以後的資料中還有沒被修改的資料,這樣就叫幻讀。
注意
:不可重複度的重點時修改——同樣的條件,你兩次讀取的資料不相同;
           幻讀的重點在於新增或刪減——同樣的條件兩次讀取的資料不一樣了。
5.事務的隔離級別

在這裡插入圖片描述設定事務的隔離級別:select session transaction isolation read level uncommitted;
檢視當前的隔離級別:select @@tx_isolation;
隔離級別例子:可序列化客戶端A(select)————》DBMS——(鎖)——》庫
客戶端B(update)————》等待佇列
當A在執行select的時候 DBMS操作會對庫加鎖,那麼B只能在等待佇列,等到A的操作完成釋放鎖或等待超時才可以執行操作。
注意:mysql預設的級別是可重複讀,一般情況不要修改。
6.事務的ACID特性
A(Atomicity):原子性——》一個事務不可分割
C(consistency):一致性——》事務始終與系統保持一致
I(isolation):獨立性——》各個事務之間是相互獨立的
D(Durability):永續性——》一個事務一旦提交將保持現有的性質
二、檢視
1.檢視的概念:檢視是一個虛擬表,它的定義是基於查詢一個完整的表,檢視和真實的表一樣包含一系列帶有名稱的列和行資料。
2.檢視的建立:create view 檢視名 as select 語句;
注意:
(1)在建立檢視的時候檢視名最後加上view_的字首,這樣更加易於區別普通表。
(2)對檢視的資料進行修改也會影響到基表,對基表的資料進行修改也會影響到檢視。因為檢視的資料就來自於基表。
3.刪除檢視:drop view 檢視名;(檢視不會刪除基表)
4.檢視規則和限制
(1)檢視名不可重複
(2)建立檢視的數目無限,但是要考慮它的效能
(3)檢視不能新增索引,檢視不儲存,索引需要儲存
(4)檢視可以提高安全性,但必須有訪問許可權
(5)當檢視和select後面的表同時出現order by時,檢視的將會被覆蓋只有select後面的才起作用。
三、使用者管理
對於一個數據庫,可能有多個人需要使用它,但是如果每一個人都用這個資料庫那麼會出現許多問題,這個資料庫擁有所有的許可權,這些使用的人都擁有對這個資料庫操作的所有許可權。
在這裡插入圖片描述


通過使用者管理,將root使用者中一些許可權抹去形成另外一個使用者,這樣的話風險性就會降低。
1.使用者
(1)使用者資訊:MySQL中的使用者都在系統資料庫的mysql的user表中;
在這裡插入圖片描述
host:表示這個主機可以從哪個主機登陸,如果時localhost表示只能從本機登陸;
user:使用者名稱
authentication_string:使用者密碼通過了passwo函式加密的;
—prive:使用者擁有的許可權
(2)建立使用者
create user ‘使用者名稱’@‘登陸主機或ip’ identified by ‘密碼’;
(3)刪除使用者
drop user ‘使用者名稱’@‘主機名’;
‘litao’@’%’===>直接給個使用者名稱,不能刪除,它預設是%,表示所有地方可以登陸的使用者;
(4)修改使用者密碼
自己修改自己的密碼:
set password = password(‘新的密碼’);
root使用者修改指定使用者密碼:
set password for ‘使用者名稱’@‘主機名’=password(‘新的密碼’);
2.使用者的許可權
(1)給使用者授權
grant 許可權列表 on 庫.物件名 to ‘使用者名稱’@‘登陸位置’ [identified by ‘密碼’]
a.
. *:代表本系統中的所有資料庫的所有物件
b.庫. *:表示某個資料庫中的所有資料物件
c.identified by表示可選。
(2)重新整理許可權
如果發現賦予許可權後任然沒有生效,那麼就用下面的命令重新整理許可權
flush privileges;
(3)回收許可權
revoke 許可權列表 on 庫.物件名 from ‘使用者名稱’@‘登陸位置’;