事務(wù)的基本介紹
概念
如果一個包含多個步驟的業(yè)務(wù)操作,被事務(wù)管理臭埋,那么這些操作要么同時成功要么同時失敗
操作
- 開啟事務(wù) start transcation
- 回滾 rollback
- 提交 commit
CREATE TABLE account (
'' id INT PRIMARY KEY AUTO_INCREMENT,
'' NAME VARCHAR(10),
'' balance DOUBLE
'' );
'' -- 添加數(shù)據(jù)
'' INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
''
''
'' SELECT * FROM account;
'' UPDATE account SET balance = 1000;
'' -- 張三給李四轉(zhuǎn)賬 500 元
''
'' -- 0. 開啟事務(wù)
'' START TRANSACTION;
'' -- 1. 張三賬戶 -500
''
'' UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
'' -- 2. 李四賬戶 +500
'' -- 出錯了...
'' UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
''
'' -- 發(fā)現(xiàn)執(zhí)行沒有問題,提交事務(wù)
'' COMMIT;
''
'' -- 發(fā)現(xiàn)出問題了灾测,回滾事務(wù)
'' ROLLBACK;
MySQL數(shù)據(jù)庫中事務(wù)默認自動提交
一條DML語句會自動提交一次事務(wù)
手動提交:需要先開啟事務(wù)糯俗,再提交
查看事務(wù)提交方式
SELECT @@autocommit;
1---代表自動提交 0---代表手動提交
事務(wù)的四大特征
- 原子性:是不可分割的最小操作單位,要么同時成功徐伐,要么同時失敗
- 持久性:當事務(wù)提交或回滾后,數(shù)據(jù)庫會持久化的保存數(shù)據(jù)募狂。
- 隔離性:多個事務(wù)之間办素,相互獨立。
- 一致性:事務(wù)操作前后祸穷,數(shù)據(jù)總量不變性穿。
事務(wù)的隔離級別
概念
多個事務(wù)之間隔離的,相互獨立的雷滚。但是如果多個事務(wù)操作同一批數(shù)據(jù)需曾,則會引發(fā)一些問題,設(shè)置不同的隔離級別就可以解決這些問題祈远。
存在問題
- 臟讀:一個事務(wù)呆万,讀取到另一個事務(wù)中沒有提交的數(shù)據(jù)
- 不可重復(fù)讀(虛讀):在同一個事務(wù)中,兩次讀取到的數(shù)據(jù)不一樣绊含。
- 幻讀:一個事務(wù)操作(DML)數(shù)據(jù)表中所有記錄桑嘶,另一個事務(wù)添加了一條數(shù)據(jù)炊汹,則第一個事務(wù)查詢不到自己的修改躬充。
隔離級別:
- read uncommitted:讀未提交
- 產(chǎn)生的問題:臟讀、不可重復(fù)讀讨便、幻讀
- read committed:讀已提交
- 產(chǎn)生的問題:不可重復(fù)讀充甚、幻讀
- repeatable read:可重復(fù)讀 (MySQL默認)
- 產(chǎn)生的問題:幻讀
- serializable:串行化
- 可以解決所有問題
隔離級別從小到大安全性越來越高,但是效率越來越低
- 數(shù)據(jù)庫查詢隔離級別
- select @@tx_iso;ation
- 數(shù)據(jù)庫設(shè)置隔離級別
- set global transaction isolation level read committed 級別字符串
DCL 數(shù)據(jù)庫管理與授權(quán)
管理用戶
- 添加用戶
- 語法:CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼’;
- 刪除用戶
- 語法 DROP USER '用戶名'@'主機名';
- 修改用戶密碼(8以下版本適用霸褒,8以上版本)
- 語法 UPDATE USER SET PASSWIRD = PASSWORD('新密碼') WHERE USER = '用戶名';
- 8版本以上:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';- 查詢用戶
use mysql;
SELECT * FROM USER;
注意:在DCL語句中 %代表任意主機
授權(quán)
查詢權(quán)限
- 語法 SHOW GRANTS FOR '用戶名'@‘主機名’;
授予權(quán)限
- 語法 GRANT 權(quán)限列表 on 數(shù)據(jù)庫名.表名 to '用戶名'@'主機名';
授予所有權(quán)限在所有數(shù)據(jù)庫: - all:代表所有權(quán)限
- *:代表數(shù)據(jù)庫通配符 . 代表所有數(shù)據(jù)庫所有數(shù)據(jù)表
···
grant SELECT on db1.stu to 'macwx'@'%';
···
刪除權(quán)限
- 語法 :revoke 權(quán)限類別 on 數(shù)據(jù)庫名.表名 from '用戶名'@'主機名';