簡體   English   中英

SQL事務在MySQL中到底有多原子?

[英]How atomic are SQL transactions really in MySQL?

我想知道-如果我有一個SQL事務,在其中一條語句中執行選擇查詢,然后在后來的語句中執行更新查詢,是否可以確保在這兩者之間的外部因素沒有改變?

  • 所以我在交易中選擇了若干行

  • 另一個過程更改事務外的行one

  • 比我想在交易中進行更新

那會發生嗎? 我知道總事務要么發生,要么不發生,但是1個事務中的所有單個語句是否也以1個原子單位執行,而兩個不同的語句之間什么也沒發生? 還是通過設置手動表鎖定來確保數據庫在兩個語句之間鎖定的唯一方法?

順便說一下,這個問題就是這樣的:我將資金從一個用戶(買方)轉移到另一個用戶(賣方)。 但是,買方在下訂單時已經存入了錢。 現在,他可以隨時取消此購買訂單。 然后,我將把存入的錢還給他。 因此,現在可能發生的情況是,我正在將存入的資金從買方轉移到賣方,而買方取消了他的訂單,我將錢還給了他。 因此,現在將錢分給買方和賣方。 這需要一些高級隔離對嗎?

這取決於事務隔離級別。 我曾經使用過的所有數據庫的默認隔離級別為“讀取已提交”,並且該級別允許查看其他已提交事務所做的更改。 相反,“串行”或“快照”隔離級別將當前事務與其他事務隔離開來,但其擴展性不如“讀取已提交”。 您可以更改每個事務的隔離級別,也可以全局更改所有現代數據庫的全局隔離級別,但是我不建議在沒有充分理由的情況下更改隔離級別。對於典型用例,“ Read Committed”是一個很好的隔離,因為它不需要鎖定讀取,而串行隔離則使用大量鎖定以使事務成為串行而不是並發,並且可能無法在典型的用例中擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM