tft每日頭條

 > 科技

 > 數據庫事務未提交

數據庫事務未提交

科技 更新时间:2024-06-27 02:42:51

無論是開發APP還是網站都離不開數據庫,無論是往數據庫裡讀還是寫數據都離不開事務管理,事務管理的核心是鎖和并發,采用同步控制的方式保證并發的情況下性能盡可能高。服務器每個處理器單位時間内隻能做一件事,要麼讀取數據、要麼寫入數據。

數據庫事務未提交(數據庫事務管理)1

​當多個人去讀、寫操作時,比如很火的吃雞遊戲,如果不加訪問控制,系統勢必會産生沖突,服務器就會癱瘓。而事務相當于在讀、寫操作之外增加了同步的模塊,進而保證隻有一個線程進入事務當中,而其他線程不會進入,從而避免服務器癱瘓。

數據庫事務未提交(數據庫事務管理)2

​事務管理的四大特性分别是:原子型、一緻性、隔離性和持久性。

原子性:原子性指的是事務中包含的所有操作要麼全做,要麼全不做。

一緻性:一緻性是指在事務開始以前,數據庫處于一緻性的狀态,事務結束後,數據庫也必須處于一緻性的狀态。

隔離性:隔離性要求系統必須保證事務不受其他并發執行的事務的影響。

持久性:持久性是指一個事務一旦成功完成,它對數據庫的改變必須是永久的,即使是在系統遇到故障的情況下也不會丢失,數據的重要性決定了事務的持久性的重要。

數據庫事務未提交(數據庫事務管理)3

​事務管理的步驟叫做事務單元。事務單元是通過開始然後提交(Begin-Traction、Commit和Rollback之間所有針對數據的寫入、讀取的操作都應該添加同步訪問),開始和提交之間就是一個同步的事務單元,事務單元之間的Happen-Before關系中的四種關系:讀寫、寫讀、讀讀、寫寫。所有事務之間的關系都可以抽象成這四種之一來對應現在所有的業務邏輯處理。

如要建立一個基于人員信息的索引、從數據庫中讀取一行記錄、向數據庫中寫入一行記錄,同時更新這行記錄的所有索引、删除整張表等都是一個事務單元,事務單元的實現方式 Two Phase Lock(2PL)是數據庫中非常重要的一個概念。

數據庫操作Insert、Update、Add、Delete都是先讀再寫的操作,例如Insert操作是先讀取數據,讀取之後判讀數據是否存在,如果不存在,則寫入該數據,如果數據存在,則返回錯誤。假設在該場景下沒有讀操作,隻是單純寫入數據,則數據本身并沒有事務操作,别的操作與之類似。數據庫利用這些操作的特性,在每一次查詢過程中,隻要查到數據,就會在該數據上加鎖。所有被讀取的數據都已加鎖,不會再被其他人讀到,也就是說對數據進行的中間操作狀态對所有人都不可見,當所有中間狀态完成後,提交操作時,解開鎖,此時數據對所有系統可見,隻能看到兩種狀态,比如開始時,A有1000元,B是窮光蛋;結束時,B有1000元,A是窮光蛋,而中間A的錢如何轉移到B身上的過程被鎖隐藏掉了,這個操作就是數據庫中處理事務的最标準的方式。

數據庫事務未提交(數據庫事務管理)4

​事務中的Trx2(JoeLock)與其他事務不相關,因此可以并行執行;Trx1需要Lock兩個數據Boblock和Smithlock,而Trx3同樣需要Lock這兩個數據,因此Trx3必須等待,且等待在Boblock上;Joe事務會先結束,Trx3會等到Trx1完成後才會開始。處理事務的常見方法 處理事務的常見方法有排隊法、排他鎖、讀寫鎖、MVCC等方式。

排隊法 :事務處理中最重要也是最簡單的方案是排隊法,單線程地處理一堆數據。在Redis中,如果數據全部在内存中,則單線程處理所有Put、Get操作效率最高。這是因為多線程本質是CPU模拟多個線程,這種模拟是以上下文切換為代價,而對于内存的數據庫來說,沒有上下文切換時效率最高。單個CPU綁定一塊内存的數據,針對這塊數據做多次讀寫操作時都是在單個CPU上完成的,單線程處理方式在内存的情況是效率是最優的。 那麼什麼時候事務需要用到多線程呢?這個問題的本質取決于下層所使用的存儲,如果是内存操作,則可以動态地申請和銷毀内存塊;而磁盤的IOPS很低,但吞吐量很高。如果一個場景涉及多次讀寫操作,單線程可以很高的效率對于内存進行讀寫操作。由于磁盤的IOPS僅為内存的幾千分之一,如果依舊用操作内存的方式操作磁盤,那系統的整體性能将會很低,這意味着必須将大量的讀寫操作聚合成一個Batch後再提交時才能達到較好的性能。而将大量請求攢到一起的方式一是異步,也就是請求本身和線程不綁定,線程可以不Block(本質來說還是一種多線程的方式),處理完一個線程後再處理其他線程。這種做法的核心是将大量不同的請求提交到一個Buff 設備中,多線程或異步非常常見,在設計系統時,面對磁盤、網絡、SSD等慢速設備必須考慮使用多線程。

排他鎖:有些場景不适合用單線程操作,可以利用排他鎖的方式來快速隔離并發讀寫事務。數據庫中有一些事務單元是共享的,如事務單元1是共享的,事務單元2/3共享數據;針對事務單元2/3共享數據的所有讀寫Block住,事務單元1單獨用一個鎖來控制,用這種方式完成系統的訪問控制。

數據庫事務未提交(數據庫事務管理)5

​讀寫鎖:如果是一個隻讀的事務,例如隻對數據進行查詢操作,在該過程中數據一定不被修改,因此多個查詢操作可以并行執行,因此一種針對讀讀場景的優化自然而然産生讀寫鎖。讀寫鎖的核心是在多次讀的操作中,同時允許多個讀者來訪問共享資源,提高并發性。

MVCC:在最初的數據庫事務實現中是不存在MVCC的,本質是Copy On Write,也就是每次寫都是以重新開始一個新的版本的方式寫入數據,因此數據庫中也就包含了之前的所有版本。在數據讀的過程中,先申請一個版本号,如果該版本号小于正在寫入的版本号,則數據一定可以查詢到,無需等到新版本完全寫完即可返回查詢結果。這種方式可以在讀讀不阻塞的前提下,實現讀寫/寫讀不阻塞,盡可能保證所有的讀操作并行,而寫操作串行。

數據庫事務未提交(數據庫事務管理)6

事務的調優思路是在不影響業務應用的前提下用最科學的方法進行調度:

第一,盡可能減少鎖的覆蓋範圍,例如Myisam表鎖到Innodb的行鎖就是一個減少鎖覆蓋範圍的過程;對于原位鎖(排他鎖、讀寫鎖等)可變為MVCC多版本(本質仍然是減少鎖的範圍)。

第二,增加鎖上可并行的線程數,例如讀鎖和寫鎖的分離,允許并行讀取數據。

第三,選擇正确鎖類型,确保服務器并發控制良好。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved