資料庫事務是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。但不是任意的資料庫操作序列都能成為事務
對mysql常見的引擎有:myisam和innodb,myisam是預設高速的引擎並不支援事務功能,innodb支援行鎖定和事務處理,速度比myisam稍慢。
它的存在包含有以下兩個目的:
1.為資料庫操作序列提供了乙個從失敗中恢復到正常狀態的方法,同時提供了資料庫即使在異常狀態下仍能保持一致性的方法。
2.當多個應用程式在併發訪問資料庫時,可以在這些應用程式之間提供乙個隔離方法,以防止彼此的操作互相干擾。
隔離級別
讀未提交
不可重複讀
幻讀read uncommitted會會
會read committed不會
會repeatable read不不
會serializable不不
不悲觀鎖:假設會發生併發衝突,迴避一切可能違反資料完整性的操作。
樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性,注意樂觀鎖並不能解決髒讀的問題。
在一般情況下,悲觀鎖依靠資料庫的鎖機制實現,以保證操作最大程度的排他性和獨占性,因而會導致資料庫效能的大量開銷和併發性很低,特別是對長事務而言,這種開銷往往過於巨大而無法承受。為了解決這樣的問題,樂觀鎖機制便出現了。樂觀鎖,大多情況下是基於資料版本( version )記錄機制實現。何謂資料版本?即為資料增加乙個版本標識,在基於資料庫表的版本解決方案中,一般是通過為資料庫表增加乙個 「version」 欄位來實現。讀取出資料時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交資料的版本資料與資料庫表對應記錄的當前版本資訊進行比對,如果提交的資料版本號大於資料庫表當前版本號,則給予更新,否則認為是過期資料。ok~,關於悲觀鎖和樂觀鎖的簡單概念就先了解到這。
在mysql中,為了保證資料一致性和防止資料處理衝突,引入了加鎖和解鎖的技術,這樣可以使資料庫中特定的資料在使用時不讓其他使用者(程序或事務)操作而為該資料加鎖,直到該資料被處理完成後再進行解鎖。根據使用目的不同把鎖分為共享鎖定(也稱為讀取鎖定)和排他鎖定(寫入鎖定)。
共享鎖定:將物件資料變為唯讀形式的鎖定,這樣就允許多方同時讀取乙個資料,此時資料將無法修改。
排他鎖定:在對資料進行insert/update/delete時進行鎖定,在此時其他使用者(程序或事務)一律不能讀取資料,從而也保證資料完整性。
通過上述的分析,我們也理解了事務、鎖和隔離級別的概念,但鎖和事務以及分離水平關係如何呢?實際上,事務是解決多條sql執行執行過程的原子性、一致性、隔離性、永續性的整體解決方案,而事務分離水平則是併發控制的整體解決方案,其實際是綜合利用各種型別的鎖來解決併發問題。鎖是資料庫併發控制的內部基礎機制。對應用開發人員來說,只有當事務分離水平無法解決併發問題和需求時,才有必要在語句中手動設定鎖。關於鎖的鎖定,對於update、delete和insert語句,innodb會自動給涉及資料集加排他鎖(x);對於普通select語句,innodb不會加任何鎖,事務可以通過以下語句顯示給記錄集加共享鎖或排他鎖。請注意innodb行鎖是通過給索引上的索引項加鎖來實現的,也就是說,只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖。
Mysql鎖機制和事務控制
b 如何加鎖 b 鎖定表的語法 lock tables tbl name as alias tbl name as alias b 解鎖語法 b unlock tables innodb的儲存引擎提供行級鎖,支援共享鎖和排他鎖兩種鎖定模式,以及四種不同的隔離級別。死鎖innodb自動檢測事務的死鎖,...
mysql事務與鎖機制 mysql事務與鎖機制
在併發下事務會容易出現的一些問題 資料更新丟失 兩個事務同時操作一條資料,乙個事務因為異常導致資料更新丟失 髒讀 乙個失誤開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。不可重複讀 乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的...
Mysql事務隔離級別和鎖機制
一.spring支援四種事務隔離級別 1.isolation read uncommitted 讀未提交 這是事務最低的隔離級別,它充許令外乙個事務可以看到這個事務未提交的資料。2.isolation read committed 讀已提交 保證乙個事務修改的資料提交後才能被另外乙個事務讀取。另外乙...