2011-06-12 75 views
1

我有一個事務在數據庫上執行一次讀取,然後進行一次寫入。如果我在MySql中選擇MyIsam作爲我的數據庫引擎,那麼MyIsam的表級鎖定機制可以保證我一旦事務開始讀取,該表就被鎖定而不受所有其他事務的影響?表級鎖定保證是什麼?

我的意思是,如果有兩個或兩個以上的交易,我希望他們在這個順序:

R W R W R W R W R W... 

但是,如果這些都按此順序進行:

R R R R W W W W.... 

我的數據庫進入不一致州。這是該特定表格中的具體要求。是否讓桌子MYIsam足夠?如果不是,我還需要做什麼?表級鎖定是否僅用於寫入?

+0

gaurantees不好併發。 – 2011-06-12 06:30:12

+0

@ f00其實這種情況是由於這個... stackoverflow.com/questions/6318149/...因爲我終於決定使用上層爲我做這個工作.. – sasidhar 2011-06-12 07:46:54

回答

2

MySQL的文檔指出:

  • LOCK TABLES不是事務安全 且嘗試鎖定 表之前隱含提交任何活動 交易。

  • 開始一個事務(例如,與 START TRANSACTION)隱含 提交任何當前事務和 釋放現有的鎖。

但是這些規定適用於事務引擎(InnoDB)。 MyISAM不支持InnoDB風格的事務。

MyISAM具有讀鎖(這將防止來自任何會話的寫入)和寫鎖(防止從其他會話讀取和寫入)。多個會話可以獲取讀取鎖定,但是如果一個會話獲得寫入鎖定,則在寫入鎖定就緒時,其他任何會話都無法讀取,鎖定或寫入表格。

我鼓勵你關於這個主題,以及鏈接到頁面頂部鏈接到的那些頁面consult the docs。對不起,鏈接指的是特定的版本號;我不知道鏈接到MySQL文檔的版本不可知的方式。

這聽起來像你需要獲得一個寫鎖定,並在鎖定處於活動狀態時進行讀/寫操作,然後釋放它,然後轉到下一個。如果您首先獲得讀鎖,請執行讀取操作,然後釋放並獲得寫鎖定,則會暴露出競爭條件。

+0

所以看起來像我需要有專門的鎖該表,那麼如果我獨佔獲取一個寫鎖,然後執行讀操作,接着寫,然後釋放寫鎖,該怎麼辦? – sasidhar 2011-06-12 05:37:06

+0

@sasidhar:這就是你必須這樣做的:獲得一個寫鎖,進行讀和寫,然後釋放鎖。同時其他鎖定請求將被阻止。如果任何會話的優先級較低,則可以使用LOW_PRIORITY修飾符進行某種課程粒度調度。 – DavidO 2011-06-12 05:40:20

相關問題