mysql sql 事務寫作 mysql中的事務

2021-10-18 09:49:51 字數 2573 閱讀 6943

事務

事務是一組原子性sql查詢語句,被當作乙個工作單元。若mysql對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對資料生效,若sql中任意不能執行或出錯則事務操作失敗,所有對資料的操作則無效(通過回滾恢復資料)。

事務有四個屬性

原子性:事務被認為不可分的乙個工作單元,要麼全部正常執行,要麼全部不執行。

一致性:事務操作對資料庫總是從一種一致性的狀態轉換成另外一種一致性狀態。

隔離性:乙個事務的操作結果在內部一致,可見,而對除自己以外的事務是不可見的。

永久性:事務在未提交前資料一般情況下可以回滾恢復資料,一旦提交(commit)資料的改變則變成永久(當然用update肯定還能修改)。

多事務執行時的併發問題

第一類丟失更新:撤銷乙個事務時,把其他事務已提交的更新資料覆蓋;

髒讀:乙個事務讀到另乙個事務未提交的更新資料;

虛讀:乙個事務讀到另乙個事務已提交的新插入的資料;

不可重複讀:乙個事務讀到另乙個事務已提交的更新資料;

第二類丟失更新:這是不可重複讀中的特例,乙個事務覆蓋另乙個事務已提交的更新資料。

資料庫鎖

共享鎖用於讀資料操作,他是非獨佔的,允許其他事務同時讀取其鎖定的資源,但不允許其他事務更新他。

加鎖條件:當乙個事務執行select語句時。

解鎖條件:預設情況下,資料讀取後,資料庫系統立即釋放共享鎖。

相容性:放置共享鎖後還可放置共享鎖和更新鎖。

併發性:具有良好的併發效能。當多個事務讀取相同的資料時,每個事務都會獲得一把共享鎖,因此可以同時讀鎖定的資料。

獨佔鎖也叫排他鎖,使用與修改資料的場合。他鎖定的資源,其他事務不能進行讀寫。

加鎖條件:當乙個事務執行insert,update,delete時,資料庫系統會自動對被操作的資料使用獨佔鎖。如果該資料已有其他鎖存在,則不能放置獨佔鎖。

解鎖條件:事務結束。

相容性:不和其他鎖相容。

併發性:併發性差,只允許有乙個事務訪問鎖定資料。其他事務需等待,直到當前事務結束。

更新鎖更新操作的初始階段用來鎖定可以能要被修改資源的鎖。更新鎖可避免使用共享鎖造成的死鎖現象。

加鎖條件:當執行update時,資料庫系統會先為事務分配乙個更新鎖。

解鎖條件:當讀取資料完畢,執行更新操作時,更新鎖公升級為獨佔鎖。

相容性:與共享鎖相容。乙個資源可同時放置更新鎖和共享鎖,但只能放置一把更新鎖。

併發性:允許多個事務同時讀鎖定的資源,但不允許其他事務修改。

讀鎖也叫共享鎖、s鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s 鎖。這保證了其他事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。

寫鎖又稱排他鎖、x鎖。若事務t對資料物件a加上x鎖,事務t可以讀a也可以修改a,其他事務不能再對a加任何鎖,直到t釋放a上的鎖。這保證了其他事務在t釋放a上的鎖之前不能再讀取和修改a。

表鎖操作物件是資料表。mysql大多數鎖策略都支援(常見mysql innodb),是系統開銷最低但併發性最低的乙個鎖策略。事務t對整個表加讀鎖,則其他事務可讀不可寫,若加寫鎖,則其他事務增刪改都不行。

行級鎖操作物件是資料表中的一行。是mvcc技術用的比較多的,但在myisam用不了,行級鎖用mysql的儲存引擎實現而不是mysql伺服器。但行級鎖對系統開銷較大,處理高併發較好。

mvcc

多版本併發控制(mvcc,multiversion currency control)。一般情況下,事務性儲存引擎不是只使用表鎖,行加鎖的處理資料,而是結合了mvcc機制,以處理更多的併發問題。mvcc處理高併發能力最強,但系統開銷比最大(較表鎖、行級鎖),這是最求高併發付出的代價。

如何防止死鎖

合理安排表訪問順序;

使用短事務(包含盡可能少的能在短時間內完成操作的事務);將事務分解為多個小事務,讓後分別執行。這樣可保證每個小事務的快速完成,減少對資料資源鎖定的時間;減少執行事務過程中等待需要更新的資料。

如果對資料要求不高,可以允許髒讀。髒讀不需要對資料資源加鎖,可以避免鎖衝突;

如果可能,錯開多個事務訪問相同資料資源的時間,防止鎖衝突;

使用盡可能低的事務隔離級別。

資料庫事務隔離級別

serializalble: 序列化。乙個事務在執行過程完全看不到其他事務對資料庫所做的更新。當兩個事務同時訪問相同資料時,第乙個事務必須等第二個事務完成後才能訪問。

repeatable read: 可重複讀。事務在執行過程中可以看到其他事務已提交的新插入記錄,但不能看到其他事務已提交的對已有記錄的更新。

read committed: 讀已提交資料。事務在執行過程中可以看到其他事務已提交的新插入記錄,也可看到其他事務已提交的對已有記錄的更新。

read uncommited: 讀未提交資料。事務在執行過程既可以看到其他事務沒有提交的新插入資料,也可看到其他事務已經提交的對已有記錄的更新。

其中serializalble的隔離級別最高,但併發效能最差。而read uncommited的隔離級別最低,但併發效能最好。隔離級別越高,越能保證資料的完整性和一致性,但併發效能則會降低。對於多數程式,可以優先考慮把資料庫系統的隔離級別設定為read committed,它可以避免髒讀,而且具有較好的併發效能。

mysql中事務的特性 mysql中事務的四大特性

原子性 atomicity 事務就像 原子 一樣,不可被分割,組成事務的dml操作語句要麼全成功,要麼全失敗,不可能出現部分成功部分失敗的情況。一致性 consistency 一旦事務完成,不管是成功的,還是失敗的,整個系統處於資料一致的狀態。隔離性 isolation 乙個事務的執行不會被另乙個事...

mysql中的事務和鎖 MySQL中的事務和鎖

鎖 行級鎖select for update nowaitfalse,skip false 注意必須用在事物裡面 所有匹配的行將被鎖定,知道事務結束。這意味著可以通過鎖防止資料被其他事務修改。一般情況下如果其他事務鎖定了相關行,那麼本查詢將被阻塞,直到鎖被釋放。事務事務的四大特性 1.原子性 事務包...

MySql中的事務

一.mysql的事務支援不是繫結在mysql伺服器本身,而是與儲存引擎相關 1.myisam 不支援事務,用於唯讀程式提高效能 2.innodb 支援acid事務 行級鎖 併發 二.乙個事務是乙個連續的一組資料庫操作,就好像它是乙個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單...