MySQL transaction事務(wù)安全示例講解
事務(wù)安全 transaction
事務(wù) transaction 訪問可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項的一個程序執(zhí)行單元unit
事務(wù)由事務(wù)開始(begin transaction)和事務(wù)結(jié)束(end transaction)之間執(zhí)行的全體操作組成
事務(wù)基本原理
MySQL允許將事務(wù)統(tǒng)一進行管理(存儲引擎innodb),將用戶所做的操作,暫時保存起來,不直接放到數(shù)據(jù)表(更新),等到用戶確認結(jié)果之后再進行操作
事務(wù)通常是自動提交,也可以手動提交
自動事務(wù)
當(dāng)客戶端發(fā)送一條SQL指令(寫操作,增刪改)給服務(wù)器的時候,服務(wù)器在執(zhí)行后,不用等待用戶反饋結(jié)果,會自動將結(jié)果同步到數(shù)據(jù)表
兩個客戶端,一個客戶端執(zhí)行SQL指令,另一個客戶端查看執(zhí)行結(jié)果
通過變量控制自動事務(wù)
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ -- 關(guān)閉自動事務(wù) set autocommit = off; mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+
關(guān)閉自動事務(wù)之后,一個客戶端修改數(shù)據(jù),另個一客戶端看不到修改的結(jié)果
一旦關(guān)閉自動事務(wù),就需要用戶提供是否同步的命令
- commit 提交 (同步到數(shù)據(jù)表,事務(wù)會被清空)
- rollback 回滾 (清空之前的操作,不要了)
-- 客戶端A關(guān)閉自動事務(wù)后操作數(shù)據(jù) mysql> select * from my_class; +----+--------+ | id | name | +----+--------+ | 1 | 一班 | | 3 | 三班 | +----+--------+ 2 rows in set (0.01 sec) mysql> insert into my_class (name) values('四班'); Query OK, 1 row affected (0.00 sec) mysql> select * from my_class; +----+--------+ | id | name | +----+--------+ | 1 | 一班 | | 3 | 三班 | | 5 | 四班 | +----+--------+ 3 rows in set (0.00 sec) -- 客戶端B看不到新增的 四班數(shù)據(jù), mysql> select * from my_class; +----+--------+ | id | name | +----+--------+ | 1 | 一班 | | 3 | 三班 | +----+--------+ 2 rows in set (0.00 sec)
客戶端A執(zhí)行commit 提交事務(wù)之后,客戶端B就可以看到新增的數(shù)據(jù)了
通常不需要關(guān)閉自動事務(wù),需要使用事務(wù)的時候,使用手動事務(wù)
手動事務(wù)
開始、過程、結(jié)束,都要用戶手動發(fā)送事務(wù)操作指令來實現(xiàn)
手動事務(wù)指令
-- 1、開啟事務(wù),從這條語句開始,后面所有的語句都不會直接寫入到數(shù)據(jù)表,保存在事務(wù)日志中 start transaction -- 2、事務(wù)處理,多個指令構(gòu)成 -- 3、事務(wù)提交,結(jié)束事務(wù) commit / rollback
事務(wù)的使用
mysql> select * from my_class; +----+--------+ | id | name | +----+--------+ | 1 | 一班 | | 3 | 三班 | | 5 | 四班 | +----+--------+ 3 rows in set (0.04 sec) mysql> select * from my_student; +----+--------+----------+------+--------+ | id | name | class_id | age | gender | +----+--------+----------+------+--------+ | 1 | 劉備 | 1 | 18 | 2 | | 2 | 李四 | 1 | 19 | 1 | | 3 | 王五 | NULL | 20 | 2 | | 4 | 張飛 | NULL | 21 | 1 | | 5 | 關(guān)羽 | NULL | 22 | 2 | | 6 | 曹操 | 1 | 20 | NULL | +----+--------+----------+------+--------+ 6 rows in set (0.00 sec) -- 開啟事務(wù) start transaction; -- 執(zhí)行事務(wù)操作,多個修改操作 insert into my_class (name)values ('六班'); insert into my_student (name, class_id, age, gender)values ('司馬懿', 6, 26, 1); -- 提交事務(wù) commit; -- 或者回滾操作,所有數(shù)據(jù)無效清空 rollback;
回滾點
當(dāng)有一系列事務(wù)操作是,而其中的步驟如果成功了,沒有必要重新來過,可以在某個點,設(shè)置一個記號(回滾點),然后如果后面有失敗,那么可以回到這個記號的位置
-- 增加回滾點 savepoint 回滾點名字; -- 回到回滾點 清空之后所有操作 rollback to 回滾點名字;
一個事務(wù)處理過程中,如果有很多步驟,可以設(shè)置多個回滾點
事務(wù)的特點
ACID:
- 原子性 automicity 一個事務(wù)是不可分割的工作單元,要么都做,要么都不做
- 一致性 consistency 事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)
- 隔離性 isolation 一個事務(wù)的執(zhí)行,不能被其他事務(wù)干擾,操作數(shù)據(jù)的時候會鎖住該條數(shù)據(jù)
- 持久性 durability 一個事務(wù)一旦提交,他對數(shù)據(jù)庫中的數(shù)據(jù)改變就是永久的
如果條件中使用了索引,會隔離一條記錄;反之,通過全表檢索,會鎖定整個表
到此這篇關(guān)于MySQL transaction事務(wù)安全示例講解 的文章就介紹到這了,更多相關(guān)MySQL transaction 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中interactive_timeout和wait_timeout的區(qū)別
這篇文章主要介紹了MySQL中interactive_timeout和wait_timeout的區(qū)別,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解
今天小編就為大家分享一篇關(guān)于MySQL Limit性能優(yōu)化及分頁數(shù)據(jù)性能優(yōu)化詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03mysql 添加用戶并分配select權(quán)限的實現(xiàn)
在開發(fā)MySQL應(yīng)用程序時,為了保證數(shù)據(jù)的安全性和準(zhǔn)確性,通常需要設(shè)置不同級別的用戶權(quán)限,本文主要介紹了mysql 添加用戶并分配select權(quán)限的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01mysql慢查詢優(yōu)化之從理論和實踐說明limit的優(yōu)點
今天小編就為大家分享一篇關(guān)于mysql慢查詢優(yōu)化之從理論和實踐說明limit的優(yōu)點,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04