您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL transaction事務安全怎么實現”,在日常操作中,相信很多人在MySQL transaction事務安全怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL transaction事務安全怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
事務 transaction 訪問可能更新數據庫中各種數據項的一個程序執行單元unit
事務由事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成
MySQL允許將事務統一進行管理(存儲引擎innodb),將用戶所做的操作,暫時保存起來,不直接放到數據表(更新),等到用戶確認結果之后再進行操作
事務通常是自動提交,也可以手動提交
當客戶端發送一條SQL指令(寫操作,增刪改)給服務器的時候,服務器在執行后,不用等待用戶反饋結果,會自動將結果同步到數據表
兩個客戶端,一個客戶端執行SQL指令,另一個客戶端查看執行結果
通過變量控制自動事務
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ -- 關閉自動事務 set autocommit = off; mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+
關閉自動事務之后,一個客戶端修改數據,另個一客戶端看不到修改的結果
一旦關閉自動事務,就需要用戶提供是否同步的命令
commit 提交 (同步到數據表,事務會被清空)
rollback 回滾 (清空之前的操作,不要了)
-- 客戶端A關閉自動事務后操作數據 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看不到新增的 四班數據, mysql> select * from my_class; +----+--------+ | id | name | +----+--------+ | 1 | 一班 | | 3 | 三班 | +----+--------+ 2 rows in set (0.00 sec)
客戶端A執行commit 提交事務之后,客戶端B就可以看到新增的數據了
通常不需要關閉自動事務,需要使用事務的時候,使用手動事務
開始、過程、結束,都要用戶手動發送事務操作指令來實現
手動事務指令
-- 1、開啟事務,從這條語句開始,后面所有的語句都不會直接寫入到數據表,保存在事務日志中 start transaction -- 2、事務處理,多個指令構成 -- 3、事務提交,結束事務 commit / rollback
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 | 關羽 | NULL | 22 | 2 | | 6 | 曹操 | 1 | 20 | NULL | +----+--------+----------+------+--------+ 6 rows in set (0.00 sec) -- 開啟事務 start transaction; -- 執行事務操作,多個修改操作 insert into my_class (name)values ('六班'); insert into my_student (name, class_id, age, gender)values ('司馬懿', 6, 26, 1); -- 提交事務 commit; -- 或者回滾操作,所有數據無效清空 rollback;
當有一系列事務操作是,而其中的步驟如果成功了,沒有必要重新來過,可以在某個點,設置一個記號(回滾點),然后如果后面有失敗,那么可以回到這個記號的位置
-- 增加回滾點 savepoint 回滾點名字; -- 回到回滾點 清空之后所有操作 rollback to 回滾點名字;
一個事務處理過程中,如果有很多步驟,可以設置多個回滾點
ACID:
原子性 automicity 一個事務是不可分割的工作單元,要么都做,要么都不做
一致性 consistency 事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態
隔離性 isolation 一個事務的執行,不能被其他事務干擾,操作數據的時候會鎖住該條數據
持久性 durability 一個事務一旦提交,他對數據庫中的數據改變就是永久的
如果條件中使用了索引,會隔離一條記錄;反之,通過全表檢索,會鎖定整個表
到此,關于“MySQL transaction事務安全怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。