2008-12-11 51 views
3

我有一個多線程程序,而每個線程在執行開始時從MySql連接池類獲取單個連接。線程然後使用一些數據庫表包裝類來通過將其數據庫連接傳遞給包裝類來完成其業務邏輯。對這些包裝類的操作不一定是順序的,我希望這些包裝類能夠使用單一數據庫連接來獨立於彼此提交或回滾其數據庫表上的更改。我知道,MySql不允許嵌套事務,並沒有找到一種方法來實現這一點。 任何幫助,不勝感激。 謝謝!單個連接上的多個數據庫事務

回答

1

如果我正確理解問題,我相信你唯一的選擇是實現某種事務隊列,它允許你的多個線程共享單個連接。然後,每個線程都可以將「任務」添加到需要在事務中執行的隊列中。然後你有一個從隊列中選擇這些任務的進程(你甚至可以在這裏實現某種優先級),並在將結果返回到發起請求的線程之前將它們發送到數據庫。調用線程會阻​​塞,直到他們收到他們的結果,這是不理想的,但如果你真的需要有多個線程和多個事務,我不能看到另一種方式做它沒有多個連接。

1

那麼這是一個多線程單個資源使用的典型例子。

解決的辦法就是使用mutexes對mysql進行連接操作。

2

聽起來像你必須將事務與表包裝關聯,而不僅僅是逐個線程地關聯事務。 IOW,你需要創建一個事務類。在事務打開和關閉時,事務類獲取/釋放連接池中的/到連接池的連接。

該事務然後成爲您的表包裝的工廠。由事務創建的任何表包裝都在事務內部,因爲它不能訪問任何連接,只能訪問事務。

這個令人討厭的部分是保持所有對象不能訪問死對象。某些形式的SmartPtr將需要處理事務提交時發生的情況,但有些事情試圖再次使用表包裝器。

1

有一個連接池,你爲什麼不獲得更多的連接?也許可以使用信號來限制同時連接的數量。否則,您需要鎖定單個連接或使用客戶端事務(使用框架,這並不簡單,如果只有一個連接,則無論如何都需要鎖定連接,但與沒有事務相比,等待時間非常短在你的代碼方面)。

1

最簡單的解決方案是爲每個線程創建一個新的連接 - 這是通常使用Apache/PHP完成的方式。

如果您的寫入數量比讀取少得多(10個線程中只有1個需要寫入),則可以使用一個全局連接進行SELECT,併爲需要更新的每個線程創建一個新連接。在此之後,您可能可能擁有最多10個用於寫入的線程池(因此最多可以有10個併發事務)。在一天結束時,如果你想要併發,那麼你需要多個連接。