一:事務:
前端
咱們都知道,事務是數據庫管理系統中的一個邏輯單位,有有限的操做序列組成,最出名的是其 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)儘可能使用較低的隔離級別。
你們也能夠掃描關注微信公衆號,獲取更多性能相關內容: