1. 程式人生 > >MySQL-事務總結

MySQL-事務總結

什麼是事務?

       事務(Transaction)可以理解為是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即傳送的一組資料命令要麼執行,要麼不執行。因此事務是一個不可分割的工作單位,在資料庫上執行併發操作時,事務是作為最小的控制單元來使用的,特別適用於多使用者同時操作的資料系統。例如:航空公司的訂票系統 、銀行或證券系統系統等。

事務的四大特性:

 1、原子性(Atomicity):事務中所有操作是不可再分割的原子單位,也就是說事務中所有操作要麼全部執行成功,要麼全部執行失敗。             以銀行轉賬為例:張三轉1000元到李四賬上,則這個賬戶的資料將都會進行更新,正常的結果是 張三的賬戶金額會減1000元。而李四的賬號會增加1000元,可是我們知道總會有意外發生,如果因為某種原因事務在成功更新前終止了,則不會去更新這個賬戶的餘額。並且會撤銷對任何賬戶餘額的修改。所以說要麼全部執行成功,要麼全部執行失敗,不能不能修改。

          2、一致性(Consistency): 事務執行後,資料庫狀態與其他業務規則保持一致。

                   如轉賬業務,無論事務執行成功與否,參與轉賬的兩個賬號餘額之和應該是不變的。

3、隔離性(lsolation): 隔離性是指在併發操作中,不同事務之間應該隔離開來,使每個併發中的事務不會相互干擾。

                    例如:多人轉賬,張三和李四之間的轉賬與王五和趙六之間的轉賬,永遠是相互獨立。

4、永續性(Durability): 一旦事務提交成功,事務中所有的資料庫操作都必須被持久化到資料庫中 ,即使提交事務後,資料庫馬上崩潰,在資料庫重啟後,也必須能保證通過某種機制恢復。

  如何執行事務?

           在預設情況下,MySQL每執行一條SQL語句,都是一個獨立的事務,如果需要在一個事務包含多條SQL語句,那個就需要開啟事務和結束事務。

           1、開啟事務:start transaction;

            2、結束事務:commit 或 rollback;  

            其中 MySQL中預設是開啟自動提交模式的,即未指定開啟事務時,每條SQL語句都是單獨的事務完畢自動提交,可以關閉自動提交模式,手動提交或回滾事務。

            使用 SET autocommit=0|1;進行修改。 0表示關閉自動提交, 1表示開啟自動提交。

          在執行SQL語句之前,先執行strat transaction,這就開啟了一個事務(事務的起點),然後可以去執行多條SQL語句,最後要結束事務,commit 表示提交,即事務中的多條SQL語句所做出的影響會持久化到資料庫中。或者rollback:表示回滾 ,即回滾到事務的起點,之前的所有操作都會被撤銷了!。

      下面以張三給李四轉賬500元的程式碼示例 來演示 執行事務和結束事務。

       賬戶初始狀態圖:

        

       開啟事務執行轉賬操作:

      

     但如果先把事務進行提交(commit)在進行回滾  則只能回到提交後的資料。

     

     執行完後效果如下:

       

事務的3類讀問題和四大隔離級別      

     3大併發讀問題:

                     1、髒讀:讀到另一事務的未更新資料,即讀到了髒資料:

                     比如說:事務1:張三給李四轉賬100元。

                                   事務 2:李四檢視自己賬戶。

時間

事務1:張三

事務2:李四

T1

開始事務

T2

給李四轉賬100

T3

開始事務

T4

檢視賬戶餘額多了100(髒讀)

T5

提交事務

T6

誰知張三回滾了事務,回到轉賬之前的狀態。

   2、不可重複讀:表示對同一記錄的讀取不一致,因為另一個對其進行了修改。

          比如:事務1:酒店檢視兩次1008房間狀態。

                    事務2:預訂1008房間。

  時間

 事務1

事務2

T1

開始事務

T2

檢視酒店1008號房預訂狀態為空閒

T3

開始事務

T4

 預訂1008號房

T5

提交事務

T6

再次檢視1008號房狀態為使用

T7

提交事務

      3、幻讀:表示 對同一個表兩次查詢不一致,因為另一事務新增一條了記錄  與不可重複讀很相似 都是不同時間資料不一致,只不過幻讀是針對新增資料,而不可重複讀是針對更改資料。

    四大隔離級別:

           4個等級的事務隔離級別,在相同資料環境下,使用相同的輸入,執行相同的輸入,根據不同的隔離級別,可以導致不同的結果,不同事務隔離級別能夠解決的資料併發問題的能力也是不同的。

         四大隔離級別區別如下表:

隔離級別

讀取資料一致性

髒讀

不可重複讀

幻讀

可序列化(seralizable)

最高級別、不會出現併發問題,安全,但效能低。

可重複讀(Repeatable read

事務級:mysql 預設就是可重複讀,效能比seralizable好。

讀已提交資料(Read Committed)

語句級:oralce 預設的。效能比Repeatable read

讀未提交資料(Read uncommitted)

最低級別:可能出現任何事務併發問題:效能最好。


相關推薦

資料庫事務MySQL事務總結

事務特點:ACID 從業務角度出發,對資料庫的一組操作要求保持4個特徵: Atomicity(原子性):一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。 Consistency(一致性):資料庫

MySQL-事務總結

什麼是事務?       事務(Transaction)可以理解為是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即傳送的一組資料命令要麼執行,要麼不執行。因此事務是一個不可分割的工作單位,在資料庫上執行併發操作時

MySQL——事務(transaction)簡單總結

簡介: MySQL事務操作主要用於處理操作量大,複雜度高的資料,比如說,在人員管理系統中要刪除一個人員,你既要刪除他的基本資料,也要刪除該人員的相關資訊,如文章、信箱等。這些資料庫操作語句就構成了一個事務,簡單地說就是一個事務是需要批量的DML(insert、update、

mysql事務特點總結

行記錄 spl 開啟事務 glob ... .net ted oba mode 1.mysql事務有4個隔離級別,以及會出現的問題如下圖: 2. 臟讀: 開啟事務A,B。事務A在還沒有提交的情況下,假如第一次查詢id=1的用戶的age=24。事務B執行了update 表

mysql學習總結(二進位制日誌、伺服器變數、事務日誌)

1、mysql的二進位制日誌: 記錄導致資料改變或潛在導致資料帶變的SQL語句; 功能:用於“重放“日誌中的事務 Log_name :日誌名 Pos:起始位置 Ev

Mysql事務使用總結

事務使用總結: MySQL事務主要用來處理資料量大、資料複雜度高的資料操作,最經典的使用場景是銀行的轉賬:需要先從銀行賬戶A中取出錢,然後再存入銀行賬戶B中,如果中間出現問題,而沒有事務的保證,那麼就會出現B收不到錢,而A支出錢又回不到自己的賬戶的嚴重問題,那麼有了事務

mysql事務處理

特殊 oot count-1 names 系列 種類 date ins 包括 MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關1.MyISAM:不支持事務,用於只讀程序提高性能 2.InnoDB:支持ACID事務、行級鎖、並發 3.Berkeley

mysql基礎總結

更新 一個 table 命令 des 文本 found 事務 desc 1、聲明遊標:DECLARE CURSOR 2、使用creat table語句的FULLTEXT子語句,在創建基本表時,可以啟用全文本搜索 3、撤銷數據庫中已經存在的表S,使用:drop table S

MySQL : 事務處理

int pre 開啟事務 特點 nbsp rollback code margin 數據 【事務】一組SQL語句操作單元,組內所有SQL語句,完成一個業務。 若整組成功,意味著組內的全部操作都成功; 反之,若其中任何一條語

mysql索引總結

不同 正在 鍵值 tex nbsp 由於 5.0 不一定 red 今天抽空整理了下mysql的幾種索引類型,以備加深印象: 在MySQL 中,主要有四種類型的索引,分別為:B-Tree 索引,Hash 索引,Fulltext 索引和RTree索引 1、B-Tree 索引

mysql基礎(六)mysql事務

mysqlmysql事務:是一個獨立的工作單元 事務必須通過ACID測試: 原子性(Atomicity):一個事務的所有操作要麽全部成功執行,要麽全部失敗後回滾 一致性(Consistency):數據庫總是從一個一致性狀態轉換成另一個狀態 隔離性(Isolation):一個事務在做出

MySQL 學習總結2

單行函數 聯合查詢 外連接 int 查詢 where 結果 查詢語句 相同 function 函數 函數的作用比較大,一般多用在select查詢語句和where條件語句之後。按照函數返回的結果, 可以分為:多行函數和單行函數;所謂的單行函數就是將每條數據進行獨立的計

mysql-優化班學習-12-20170627-MySQL事務

src flush image when 數據 分享 mysql事務 log 學習 mysql-優化班學習-12-20170627-MySQL事務 MyRocks也支持事務 innodb_flush_log_at_trx_commit = 1sync_binl

MySQL 事務與鎖機制

mysql下表展示了本人安裝的MariaDB(10.1.19,MySQL的分支)所支持的所有存儲引擎概況,其中支持事務的有InnoDB、SEQUENCE,另外InnoDB還支持XA事務,MyISAM不支持事務。鎖可以通過SQL語句(如 LOCK TABLES )顯式申請,也可以由InnoDB引擎自動為你獲取。

mysql事務隔離級別與鎖的關系

美團 enc 自己 ren 問題總結 關系 sql 事務 sql事務 其實操作了這麽久mysql一直也沒有把mysql中事務跟鎖的關系弄得特別清楚。然後搜到美團這篇文章,順便結合一下自己遇到的問題總結一下。 首先事務有四種隔離級別: Refere

【轉載】MySQL事務以及SELECT ... FOR UPDATE的使用

商品 tail ase -a base 我們 evel erl tel MySQL中的事務,默認是自動提交的,即autocommit = 1; 但是這樣的話,在某些情形中就會出現問題:比如: 如果你想一次性插入了1000條數據,mysql會commit1000次的, 如果我

MySQL事務

之間 tom 正常 邏輯 bili nsis 數據庫管理 出錯 mysq 事務是數據庫管理系統執行過程中的一個邏輯單元,由有限的操作序列構成。 事務的ACID特性 A --> Atomic原子性,事務作為一個整體,要麽全部被執行,要麽全部不執行。InnoDB支持事務

數據庫-mysql事務

利用 savepoint 允許 異常 clas 數據庫操作語句 release ans 就會 MySQL 事務 MySQL 事務主要用於處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文

PHP與MYSQL事務處理

舉例 database 相同 bsp 幾分鐘 acl exists 細節 data PHP與MYSQL事務處理 $conn = mysql_connect(‘localhost‘,‘root‘,‘root‘) or die ("數據連接錯誤!!!"); mysql_

mysql經驗總結

https http mysql sta ons conn ant code start 1. 連接mysql遇到 Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘ (2),mysql沒