Postgresql 事務與鎖

一:事務:
前端

咱們都知道,事務是數據庫管理系統中的一個邏輯單位,有有限的操做序列組成,最出名的是其 ACID 4個屬性。redis

  • 原子性(Atomicity),事務中包含的操做,要麼所有被執行;要麼所有不被執行。sql

  • 一致性(Consistency),數據庫中數據應知足完整性約束。數據庫

  • 隔離性(Isolation),數據庫中一個事務的執行不該該影響到其餘事務。後端

  • 持久性(Durability),已經提交的事務(狀態),其對數據庫的修改等應該永久性地保存在數據庫中。微信


事務的用法多線程

1)事務開始,有兩種寫法:併發

1)BEGIN;
2) BEGIN TRANSACTION;

2) 事務結束,有兩種狀況:ide

1)COMMIT; --確認事務
2)ROLLBACK; --回滾事務


對於測試分析人員,事務的理念也能夠運用到分析問題上,好比你想分析一個update/insert/delete SQL語句的執行計劃,那麼就能夠利用事務的概念去更好地管理咱們的數據庫數據。高併發


咱們要分析以下SQL的執行計劃:

delete from public."Department" where "DepID" = '1';

那麼就能夠按照以下方式去執行:

begin;
explain analyze delete from public."Department" where "DepID" = '1';

以上獲得了delete SQL語句的執行計劃,可是你又不想真正的刪除數據,能夠繼續執行以下語句便可:

rollback;

二:鎖

Postgresql中鎖的概念和大多數關係型數據庫一致,是爲了知足事務中數據一致性的目的。通常在併發較高的數據庫中,若是不加以控制,可能會出現數據讀取和存儲不一致的狀況。


1)死鎖,若是兩個事務都在等待對方完成事務,那麼就頗有可能產生死鎖,產生死鎖時,postgresql會自動檢測到它們,而且會讓相關事務都回滾,從而結束它們。確保應該程序以相同的順序鎖定對象,能夠有效地避免死鎖。

2)其次,鎖類型的劃分,主要能夠分爲表級鎖和行級鎖。其中最普通的兩把鎖就是Share和Exclusive這兩把鎖了。其中Share是指讀鎖,即表的內容就不能修改了,能夠爲多個事務加上此鎖,可是任何一個事務沒有釋放此鎖的話,那麼表的內容就不能被修改;Exclusive就是表級的寫鎖了,獲取此鎖的事務,若是沒有釋放,那麼其餘事務是不能讀也不能寫的。固然了,後面引入了多版本的機制(MVCC),這種情況有改善,多了2個鎖,Access Share/Access Exclusive。其中 Access Share對應的數據庫操做通常是select 操做語句;Access Exclusive對應的數據庫操做通常是alter table/drop table/truncate/reindex/vacuum full等。


如何更好的避免資源爭搶等問題,能夠考慮以下方面進行合理規避。

1)在處理高併發地處理一些共享資源時,能夠考慮將這種壓力重心從關係型數據庫轉移到in-memory的NO-SQL 數據庫,好比redis。前端能夠考慮多線程,高併發等業務需求的實現,而關鍵的後端,可使用redis自帶原生的單線程處理模式便可,其執行效率不必定差。

2)在全部的數據庫事務中以相同的次序使用資源。

3)儘可能使用較低的隔離級別。


你們也能夠掃描關注微信公衆號,獲取更多性能相關內容:

qrcode_for_gh_39009e949117_258-1.jpg

相關文章
相關標籤/搜索