l Transactionmysql
l 事務:一個最小的不可再分的工做單元;一般一個事務對應一個完整的業務(例如銀行帳戶轉帳業務,該業務就是一個最小的工做單元)程序員
l 一個完整的業務須要批量的DML(insert、update、delete)語句共同聯合完成sql
l 事務只和DML語句有關,或者說DML語句纔有事務。這個和業務邏輯有關,業務邏輯不一樣,DML語句的個數不一樣數據庫
事務由事務開始到事務結束之間執行的全體操做組成。安全
基本原理:mysql容許將事務統一進行管理(存儲引擎innodb),將用戶所作的操做暫時保存起來,不直接放到數據表(更新),等到用戶確認結果以後再進行操做。服務器
事務在mysql中一般是自動提交的,可是也是可使用手動事務。併發
自動事務:autocommit ,當客戶端發送一條SQL指令(寫操做:增刪改)給服務器的時候,服務器在執行以後,不用等待用戶反饋結果,會自動將結果同步到數據表。atom
證實:打開兩個客戶端,一個客戶端執行SQL指令,另外一個客戶端查看執行結果。spa
自動事務:系統作了額外的步驟來幫助用戶操做,系統是經過變量來控制的。autocommit3d
關閉自動事務:關閉以後系統就不在幫助用戶提交結果了。
set autocommit = off;
查看執行結果
一旦自動事務關閉,那麼須要用戶提供是否同步的命令
Commit:提交(同步到數據表,事務會被清空)
Rollback:回滾(清空以前的操做,不要了)
事務沒有提交的對比查看:在執行事務端的客戶端中,系統在進行數據查看的時候會利用事務日誌進行數據加工。
事務提交
一般,咱們不會關閉自動事務,這樣操做麻煩。所以只會在須要使用事務處理的時候,纔會進行操做(手動事務)
手動事務:不論是開始仍是過程仍是結束,都須要用戶(程序員)手動發送對應的事務操做指令來實現。
手動事務的命令:
一、start transaction; 開啓事務:從這條語句開始,後面的全部語句都不會直接寫入到數據表(保存在事務日誌中)
二、事務處理:多個指令構成
三、事務提交:commit/rollback,到這個時候全部的事務纔算結束
將多個連續的可是是一個總體的SQL指令,逐一執行。
確認提交:commit,數據寫到數據表,清空事務日誌
回滾操做:rollback,全部數據無效並清空
回滾點:savepoint,當有一系列的事務操做時,而其中的步驟若是成功了沒有必要從新來過,那麼能夠在某個成功點設置一個記號(回滾點),若是後面有失敗,那麼能夠回到這個記號位置。
回滾點在自動事務關閉後才能使用。set autocommit = off;
一、增長回滾點:savepoint 回滾點名字; //字母數字和下劃線構成
二、回到回滾點:rollback to 回滾點名字; //那個記號(回滾點)以後的全部操做沒有了
注意:若是在一個事務處理彙總,若是有不少步驟,那麼能夠設置多個回滾點。可是若是回到了前面的回滾點,後面的回滾點就失效。
事務具備4個屬性:原子性、一致性、隔離線持久性。這四個屬性一般稱爲ACID特性
原子性(atomicity):一個事務是一個不可分割的工做單位,事務中包括的諸操做要麼都作,要麼都不作
事務從事務開始起到事務提交,要麼全部操做都成功,要麼全部操做都失敗。
一致性(consistency):事務必須是使數據庫從一致性狀態變到另外一個一致性狀態,一致性和原子性是密切相關的。
數據表中的數據修改,要麼是全部操做一次性都修改,要麼根本不動。
隔離性(isloation):
一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾
一個客戶端在使用事務操做一個數據(多是一行或者整表)的時候,另一個客戶端不能對該數據進行操做。
何時是行被隔離?何時是整表被隔離?
說明:若是條件中使用了索引(主鍵),那麼系統是根據主鍵直接找到某條記錄,這個時候與其餘記錄無關,那麼只隔離條記錄;反之,若是說系統是經過全表檢索(每一條記錄都去檢查,沒有索引),被檢索的全部數據都會被鎖定(整表)
持久性(durability):持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其餘操做或故障不該該對其有任何影響。