MYSQL數據庫之事務與權限

事務

概念

1.用戶定義的一組完成特定操作的數據的集合。
2.是不可再分的工作單元,通常一個事務對應一個完整的業務。
3.數據只和增刪改有關。

特性ACID

1.原子性A:一個事務要麼全成功,要麼全失敗。
2.一致性C:事務從一個一致的狀態,到另一個一致的狀態。
3.隔離性I:不同事物併發進行,互不干擾。
4.持久性D:數據一旦改變,其變化是永久的保存在數據庫中。

MYSQL事務提交模式

1.默認是自動提交
2.手動提交

事務的開啓和結束

1.start Transaction任何DML語句都標誌着事務的開啓
2.end Transcation提交事務或者回滾事務

事務與數據庫底層數據的交互
事務的併發

1.讀取髒數據:事務1讀取事務2更新的數據,2做了回滾。
2.不可重複讀:事務1需要多次讀取同一數據,事務2在1讀取數據的時候更改看數據,導致1讀取的同一數據前後不一致。
3.幻讀:管理員1已經將數據從數值改爲相應等級,管理員2又插入數值數據,就像出現幻覺。

事務的四種隔離級別

1.未提交讀(髒讀):事務1與2都能讀到數據A,當事務1修改了數據A還未提交的時候,事務2也能讀到修改的數據。
2.提交讀:不會髒讀,事務1讀數據並修改,事務2讀同一數據,事務1提交之前,事務2讀的是原始數據。提交之後,看到的是信數據。即兩次讀的數據不一致。
3.可重複讀:兩者互不影響。
4.可串行化:事務2的執行必須在事務1執行結束之後。

USE employeemanager
-- 創建觸發器 tr_employee_insert當新員工入職的時候,數值更新
CREATE TRIGGER tr_employee_insert
AFTER INSERT ON employee
FOR EACH ROW
BEGIN
	-- 修改實際人數和實際名額
	UPDATE dept SET ActualNum=ActualNum+1 WHERE did=new.did;
	UPDATE dept SET RemainderNum=RemainderNum-1 WHERE did=new.did;
END
-- 測試
SELECT * FROM employee;
USE studentmanager;
-- 事務
-- 創建賬戶表
CREATE TABLE IF NOT EXISTS account(
	id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
	username VARCHAR(50) NOT NULL,
	money DECIMAL(9,2)
)ENGINE=INNODB
-- 插入數據
INSERT INTO account(username,money) VALUES('tom',1000);
INSERT INTO account(username,money) VALUES('jack',200);
-- 模擬事務的回滾和提交操縱
-- 關閉自動提交模式
SET autocommit=0;
-- SET autocommit=1;
-- 開始事務
START TRANSACTION;
UPDATE account SET money=money-500 WHERE username='tom';
UPDATE account SET money=money+500 WHERE username='jack';
-- 假設轉賬過程出現異常,執行回滾操作
-- ROLLBACK;
-- 假設轉賬過程沒有異常,執行提交
COMMIT;
SELECT * FROM account;
-- 查看MYSQL的事務隔離級別:可重複讀
SELECT @@tx_isolation;
-- 設置MYSQL的隔離級別,讀未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 客戶端1
-- 開始事務
START TRANSACTION;
SELECT * FROM account;
-- 客戶端2
START TRANSACTION;
UPDATE account SET money=money-100 WHERE id=1;

權限控制

USE mysql;
-- 創建用戶
SELECT * FROM user;
-- 創建用戶 CREATE USER '用戶名'@'主機名'IDENTIFIED BY '密碼'
CREATE USER user1@'localhost' IDENTIFIED BY '1234';
-- 執行flush命令使得用戶生效,刷新權限
FLUSH PRIVILEGES;
-- 創建用戶,允許任何ip都可以登錄MYSQL數據庫
CREATE USER user2@'%' IDENTIFIED BY '123456';
-- 使用drop user 刪除用戶
DROP USER user2@'%';
-- 使用delete刪除用戶
DELETE FROM user WHERE HOST='localhost' AND USER='user1';
-- 修改密碼
UPDATE user SET password=PASSWORD('123456') 
WHERE user='user1' AND HOST='localhost';
-- 查看用戶權限 SHOW GRANTS FOR 用戶名
SHOW GRANTS FOR user1@localhost;
-- 給用戶授權 GRANT 權限1....權限n ON 數據庫 表 TO 用戶名;
GRANT SELECT,UPDATE ON bigdata.* TO user1@'localhost';
FLUSH PRIVILEGES;

GRANT SELECT,UPDATE ON bigdata.test TO user1@'localhost';
FLUSH PRIVILEGES;

GRANT SELECT,UPDATE ON *.* TO user1@'localhost';
FLUSH PRIVILEGES;
--  擁有最高權限
GRANT ALL ON bigdata.* TO user2@localhost;
FLUSH PRIVILEGES;
-- 收回權限 REVOKW 權限1....權限n ON 數據庫 表 FROM 用戶名;

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