事務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事務安全怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!