亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > PostgreSQL > 正文

PostgreSQL數據庫事務實現方法分析

2020-03-12 23:45:26
字體:
來源:轉載
供稿:網友

本文實例講述了PostgreSQL數據庫事務實現方法。分享給大家供大家參考,具體如下:

事務簡介

  • 事務管理器:有限狀態機
    • 日志管理器
      • CLOG:事務的執行結果
      • XLOG:undo/redo日志
    • 鎖管理器:實現并發控制,讀階段采用MVCC,寫階段采用鎖控制實現不同的隔離級別

事務是所有數據庫系統的一個基本概念。 一次事務的要點就是它把多個步驟捆綁成了一個單一的,不成功則成仁的操作。 其它并發的事務是看不到在這些步驟之間的中間狀態的,并且如果發生了一些問題, 導致該事務無法完成,那么所有這些步驟都完全不會影響數據庫。PostgreSQL為每條事務創建一個postgre進程,并發執行事務。采用分層的機制執行事務,上層事務塊和底層事務。上層事務塊是用戶眼中的事務,用于控制事務執行的狀態;底層事務是事務中的每條語句,可以改變上層事務塊的狀態。

上層事務塊

每個postgre進程只有一個事務塊,上層事務塊記錄著本次事務執行過程中的各個狀態。

typedef enum TBlockState{  /* not-in-transaction-block states */  TBLOCK_DEFAULT,       /* idle */  TBLOCK_STARTED,       /* 執行簡單查詢事務 */  /* transaction block states */  TBLOCK_BEGIN,        /* 遇見事務開始BEGIN */  TBLOCK_INPROGRESS,     /* 事務正在執行中 */  TBLOCK_PARALLEL_INPROGRESS, /* live transaction inside parallel worker */  TBLOCK_END,         /* 遇見事務結束COMMIT/END的時候設置 */  TBLOCK_ABORT,        /* 事務出錯,等待ROLLBACK */  TBLOCK_ABORT_END,      /* 事務出錯,收到ROLLBACK */  TBLOCK_ABORT_PENDING,    /* 事務處理中,接收到ROLLBACK */  TBLOCK_PREPARE,       /* 事務處理中,收到PREPARE(分布式事務) */  /* subtransaction states */  TBLOCK_SUBBEGIN,      /* starting a subtransaction */  TBLOCK_SUBINPROGRESS,    /* live subtransaction */  TBLOCK_SUBRELEASE,     /* RELEASE received */  TBLOCK_SUBCOMMIT,      /* COMMIT received while TBLOCK_SUBINPROGRESS */  TBLOCK_SUBABORT,      /* failed subxact, awaiting ROLLBACK */  TBLOCK_SUBABORT_END,    /* failed subxact, ROLLBACK received */  TBLOCK_SUBABORT_PENDING,  /* live subxact, ROLLBACK received */  TBLOCK_SUBRESTART,     /* live subxact, ROLLBACK TO received */  TBLOCK_SUBABORT_RESTART   /* failed subxact, ROLLBACK TO received */} TBlockState;

常見的事務塊狀態轉換圖

 PostgreSQL,數據庫,事務

  • startTransactionCommand:事務塊中每條語句執行前都會調用。
  • commitTransactionCommand:事務塊中每條語句執行結束都會調用
  • abortCurrentTransaction:事務塊中語句執行錯誤,在調用點調用
  • BeginTransactionBlock:遇見BEGIN命令調用,狀態變為TBLOCK_BEGIN
  • EndTransactionBlock:遇見END調用,可能成功提交,也可能回滾
  • AbortTransactionBlock:遇見ABORT指令調用

底層事務

底層事務是需要執行的每條命令,負責處理資源和鎖的獲取和釋放,信號的處理,日志記錄等等

typedef enum TransState{  TRANS_DEFAULT,       /* idle */  TRANS_START,        /* transaction starting */  TRANS_INPROGRESS,      /* inside a valid transaction */  TRANS_COMMIT,        /* commit in progress */  TRANS_ABORT,        /* abort in progress */  TRANS_PREPARE        /* prepare in progress */} TransState;

主要有四個函數:

  • StartTransaction:由BEGIN的startTransactionCommand調用,調用結束后事務塊狀態為TBLOCK_STARTED
  • CommitTransaction:由END的commitTransactionCommand調用,提交事務
  • AbortTransaction和CleanupTransaction:釋放資源,恢復默認狀態

分布式事務

PostgreSQL提供了分布式事務中的,兩階段提交的接口

并發控制

PostgreSQL采用MVCC的方式進行并發控制,每個事務看到的是一段時間前的數據快照。同時,MVCC并不能夠解決所有問題,所以也提供了行級和表級的鎖。

標準的事務隔離級別有4個,而PostgreSQL只實現了讀已提交和可串行化。

PostgreSQL實現了8種鎖(可怕)

 PostgreSQL,數據庫,事務

太多了,就記住幾個吧。

  • 行共享鎖:select for update/for share
  • 表共享鎖:select
  • 行排他鎖:insert/update/delete
  • 表排他鎖:drop

加鎖的對象

    • 表鎖
    • 會話鎖
    • 擴展鎖:新增表空間
  • 頁:對索引頁面
  • 元組:
  • 事務:

死鎖處理

 PostgreSQL,數據庫,事務

  • postgresql檢測出最后一個等待的殺掉,oracle是第一個等待的殺掉
  • 死鎖檢測算法(等待圖)

MVCC

關鍵詞:

  • 基于事務ID
  • 行級多版本
  • 無回滾段,行內存儲
    • 一次UPDATE,產生記錄兩個版本
    • 兩個版本都存在頁面內部
typedef struct HeapTupleFields{  TransactionId t_xmin;    /* Insert,Update事務 */  TransactionId t_xmax;    /* Delete,Update,Row Locks事務ID */  union  {    CommandId  t_cid;   /* 操作ID */    TransactionId t_xvac;  /* old-style VACUUM FULL xact ID */  }      t_field3;} HeapTupleFields;

cmin:插入該元組的命令在插入事務中的命令標識(從0開始累加)
cmax:刪除該元組的命令在插入事務中的命令標識(從0開始累加)
ctid:相當于rowid , <數據塊ID,偏移量>
XID:事務ID
Xid_snapshot:當前系統中未提交的事務
CLOG:事務狀態日志(已提交的日志)

隔離級別

  1. RC:讀已提交
    1. 兩個事務可以并發更新同一行
    2. 一個事務更新,一個事務刪除同一行,刪除操作會上鎖
  2. RR:讀未提交,其實是snapshot isolation,(沖突狀態會回滾)
  3. 可串行化:serialize snapshot isolation,比標準可串行化要高,通過加內存中的意向鎖實現,不允許預加鎖的數據被其他事務變更

數據可見性判斷

  1. 記錄的頭部XID信息比當前事務更早(rr和ssi有這個要求,read commited沒有這個要求,讀已經提交可以讀未來的事務??!)
  2. 記錄頭部的XID信息不在當前的XID_snapshot中,(記錄上的事務狀態不是未提交的事務)
  3. 記錄頭部的XID信息在CLOG中代表已提交。
  • MVCC需要判斷該行數據在這個事務中的有效性,可見性,可更新性(需要鎖的幫助才能正確執行隔離級別)
  • 判斷條件:若xmin等于當前事務ID,則包含所有xmax=0(未被刪除)的元組。
    若與xmin相等的事務ID對應的事務已經被提交,則包含所有xmax=0或xmax為當前事務ID的元組。
  • 實現概要
    • 對讀不用加鎖,對寫加鎖(只阻塞寫),事務結束對比是否沖突

多行數據需要過期版本回收

  1. 頁面級:頁面訪問時回收
  2. 表級/系統級: autovacuum; vacuum

日志

  1. pg_log:數據庫活動日志(也就是數據庫的操作日志);
  2. pg_xlog:事務日志,記錄事務的執行過程,redo日志
  3. pg_clog:事務狀態日志(pg_clog是pg_xlog的輔助日志),記錄事務的結果。

希望本文所述對大家PostgreSQL數據庫程序設計有所幫助。


注:相關教程知識閱讀請移步到PostgreSQL頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近的2019中文字幕免费一页| 黑人狂躁日本妞一区二区三区| 国产精品成人一区二区三区吃奶| 欧美激情一区二区三区久久久| 日韩国产激情在线| 亚洲国产精品va在线看黑人动漫| 中文字幕9999| 自拍偷拍亚洲在线| 国产成人精品一区二区| 欧美人与物videos| 亚洲欧美日韩在线一区| 欧美xxxx18国产| 亚洲国产欧美日韩精品| 精品亚洲精品福利线在观看| 日韩久久免费视频| 成人精品aaaa网站| 亚洲国产精品一区二区三区| 国外成人在线播放| 久久精品电影网站| 在线观看中文字幕亚洲| 久久视频在线看| 91av视频在线| 久久久久久久国产| 国产精品视频1区| 狠狠爱在线视频一区| 欧美在线视频一二三| 亚洲综合自拍一区| 日韩电影免费在线观看| 国产精品综合不卡av| 色阁综合伊人av| 久久久噜久噜久久综合| 欧美精品福利视频| 欧美老女人性生活| 九九视频直播综合网| 555www成人网| 日韩在线小视频| 最近中文字幕mv在线一区二区三区四区| 91精品国产综合久久久久久久久| 欧美成人午夜影院| 日本中文字幕久久看| 亚洲一区二区三区视频播放| 欧美高清自拍一区| 久久福利视频网| 国产精品视频yy9099| 日韩免费视频在线观看| 91麻豆桃色免费看| 国产精品免费一区二区三区都可以| 久久精品在线视频| 亚洲国产精品久久久久秋霞不卡| 孩xxxx性bbbb欧美| 久久久久成人精品| 81精品国产乱码久久久久久| 日韩av在线导航| 欧美在线视频免费播放| 欧美激情区在线播放| 欧美黄色片视频| 91久久精品一区| 538国产精品视频一区二区| 大伊人狠狠躁夜夜躁av一区| 2019精品视频| 亚洲欧美日韩图片| 久久亚洲精品小早川怜子66| 国产精品一区专区欧美日韩| 欧美成人精品不卡视频在线观看| 亚洲天堂第二页| 欧美电影免费观看网站| 亚洲国产精品人人爽夜夜爽| 91香蕉亚洲精品| 国内精品久久久久久久久| 国产精品三级网站| 1769国内精品视频在线播放| 中文字幕亚洲综合久久筱田步美| 国内精品在线一区| 国产欧美一区二区| 久久天天躁狠狠躁夜夜躁2014| 国产成人欧美在线观看| 亚洲欧洲成视频免费观看| 欧美日韩性视频| 97在线观看视频| 在线日韩av观看| 久久久女人电视剧免费播放下载| 欧美中文在线字幕| 伊人久久五月天| 国产午夜精品全部视频在线播放| 久久躁日日躁aaaaxxxx| 欧美做爰性生交视频| 日韩精品免费在线| 欧美大片大片在线播放| 国产999在线| 欧美极品少妇xxxxⅹ免费视频| 国产成人avxxxxx在线看| 国产精品久久久久久久7电影| 精品国产乱码久久久久久婷婷| 亚洲国产精品99久久| 亚洲一区二区三区四区在线播放| 欧美精品久久一区二区| 国产精品专区一| 亚洲欧美精品suv| 亚洲男人av在线| 欧美极品少妇xxxxx| 国产视频福利一区| 久久夜色撩人精品| 欧美色图在线视频| 亚洲美女福利视频网站| 国产va免费精品高清在线观看| 日本欧美中文字幕| 中文字幕成人精品久久不卡| 7m第一福利500精品视频| 亚洲欧洲xxxx| 精品久久久久久中文字幕大豆网| 久久国产精品视频| 国产成人综合一区二区三区| 亚洲成人黄色在线观看| 亚洲欧美三级伦理| 欧美在线不卡区| 国产精品丝袜久久久久久高清| 欧美亚洲国产精品| 欧美日韩中文字幕| 国产成人精品免高潮在线观看| 这里只有精品在线观看| 日韩男女性生活视频| 亚洲网站在线观看| 久久影视免费观看| 欧美日韩在线观看视频| 国产日韩欧美另类| 日本人成精品视频在线| 亚洲视频欧美视频| 久久精品国产免费观看| 国产精品私拍pans大尺度在线| 亚洲变态欧美另类捆绑| 国产精品久久久久久久久久久新郎| 欧美日韩xxxxx| 亚洲缚视频在线观看| 一本久久综合亚洲鲁鲁| 欧美激情视频免费观看| 国产精品aaaa| 国产成人精品优优av| 成人免费网站在线观看| 欧美激情精品久久久| 色噜噜久久综合伊人一本| 欧美特黄级在线| 欧美www视频在线观看| 亚洲电影第1页| 97香蕉超级碰碰久久免费的优势| 欧美大片在线影院| 日韩成人av在线播放| 亚洲女人天堂网| 国产精品久久久久久久久久ktv| 日韩欧美在线第一页| 国产福利精品视频| 欧美性生活大片免费观看网址| 国产精品99久久久久久白浆小说| 日韩亚洲精品电影| 亚洲一区亚洲二区| 久久精视频免费在线久久完整在线看| 日韩视频一区在线| 日本久久亚洲电影| 欧美自拍大量在线观看| x99av成人免费| 亚洲精品女av网站| 美女久久久久久久| 91啪国产在线| 91九色在线视频| 欧美一级成年大片在线观看|