2016-03-15 66 views
1

我的問題可能非常特定於Postgres,可能不是。Postgres通過兩個不同的程序訪問單個列

我無法修改的程序可以通過npgsql和簡單的select命令訪問Postgress,我所知道的。

我也可以通過npgsql進行訪問。該表定義爲:

-- Table: public.n_data 

-- DROP TABLE public.n_data; 

CREATE TABLE public.n_data 
(
    u_id integer, 
    p_id integer NOT NULL, 
    data text, 
    CONSTRAINT nc PRIMARY KEY (p_id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE public.n_data 
    OWNER TO postgres; 

(如果這個信息是有用無論如何) 我訪問一個單一的大柱,用它讀取和寫入回去吧。

這一切都工作正常。

問題是:如果我們同時寫入,Postgres如何處理它。 有問題嗎?

如果Postgres沒有自動處理,那麼當我讀取數據,處理數據並同時進行數據更改時,如何處理它,然後在處理數據後將其寫回數據 - >丟失數據。

對數據完整性進行測試有點棘手,因爲這個數據塊非常龐大,並且很難找到損壞。

我用c#來做,如果這意味着什麼。

+0

閱讀[行鎖定](http://www.postgresql.org/docs/9。1/static/explicit-locking.html) – AlexM

+0

閱讀關於理性數據庫鎖定機制。據我所知Postgresql使用MVCC https://en.wikipedia.org/wiki/Multiversion_concurrency_control – java

回答

1

鎖定(在大多數)關係型數據庫(包括Postgres的)總是在水平,從來沒有在列級(它的行與列在關係數據庫中沒有「細胞」,「域」或「記錄「)

如果兩個事務修改同一行,則第二個事務必須等到第一個事務提交或回滾。

如果兩個事務修改不同的行,那麼只要它們不修改屬於唯一約束或主鍵屬於同一個值的列,它們就可以毫無問題地執行此操作。

在Postgres中,讀數據的訪問永遠不會被常規的DML語句阻塞。所以,當一個事務修改數據時,另一個會在第一個事務提交更改(「讀一致性」)之前看到舊數據。

處理丟失的更新,您可以使用序列化隔離級別,或使所有的交易遵循他們第一需要獲得有關行(select ... for update)鎖並按住,直到他們完成的模式。搜索「悲觀鎖定」以獲取有關此模式的更多詳細信息。

另一種選擇是在表格中包含「修改」時間戳。當進程讀取數據時,它也讀取修改時間戳。當它發回新的更改時,它包括一個where modified_at = <value obtained when reading> - 如果數據已更改,條件將不會保持爲真,並且不會更新,您需要重新啓動事務。搜索「樂觀鎖定」以查找有關此模式的更多詳細信息。


1個某些DBMS做頁面鎖定和一些升級許多行級鎖升級到表鎖。 Postgres中也沒有這種情況

+0

所有問題都完全解答了...... thx無名的馬;) – Tetragrammaton

相關問題