2015-11-25 20 views
1

如果我啓動一個事務,運行一些查詢,然後提交它,通過應用查詢結果或查詢本身來執行提交工作嗎?MySQL事務提交是否應用查詢或結果?

例如,如果我的交易包含insert into b select x from a,並且在我運行此查詢之後但在提交交易之前x發生了變化,結果將是交易過程中x的值,還是x at提交的時間?

回答

0

答案:x將具有它在讀取時間戳時的值。

更具體地說,提交是交易的一部分,所以在交易過程中或在提交時,您可能不會將其作爲解決,它們不是兩個單獨的操作。

澄清:使用交易將確保事務邊界內的所有操作看起來原子到外面的世界。

原子操作意味着:

  • 的操作應該是成功或失敗。兩者之間不得有中間環節。特別是,如果交易開始併發生故障(如停電),則需要回滾到目前爲止所做的所有更改。

  • 此外,它意味着外部世界應該把它看作一個單一的操作。如果交易使用某些值,則應在交易開始時從時間戳中獲取所有值。同樣,交易應該做的所有變化,將在交易結束的時間戳之後立即向外界提供。這是通過交易中涉及的適當形式的鎖定(獨佔,讀取或寫入)表來實現的。

所以要針對你的問題更具體,當select x from a被稱爲一個事務,表a被鎖定,直到事務提交或回滾。您提到的場景,x在我運行此查詢(事務提交/回退之前)後發生了變化,在實際上並不可行

+0

因此,當調用select時,它既讀取當時的值,又鎖定表,以便在事務提交之前不能更改它?你說事務內的所有選擇都會鎖定表,直到事務完成? – Benubird

+0

@Benubird是的,我們大多可以總結這種方式。事務中的所有READ將對它們使用的表進行WRITE鎖定,因此外部世界不能寫入這些表,但它們可以自由讀取。另一方面,如果一個事務寫入一個表,那麼該表就被鎖定,以便讀取和寫入到外部世界。 – Musa