本章的內容是開發乙個簡單的、多使用者資料庫的c函式庫。呼叫此函式庫提供的c語言函式,其他程式可以讀取和儲存資料庫中的記錄。絕大部分商用資料庫函式庫提供多程序同時更新資料庫所需要的併發控制,採用建議記錄鎖、b+樹、動態雜湊實現資料庫。
1、函式庫
開發類似ndbm函式庫,增加了併發控制機制,從而允許多程序同時更新同一資料庫。函式介面如下:
1 #include "apue_db.h"2、實現概述2 dbhandle db_open(const char *pathname, int oflag, .../* int mode */); //返回值:若成功則返回資料庫控制代碼,若出錯則返回null
3 int db_close(dbhandle db); //關閉資料庫
4 in db_store(dbhandle db, const char *key, const char*data, int flag); //向資料庫中加條新的記錄
5 char* db_fetch(dbhandle db, const char *key);//若成功則返回指向資料的指標,若記錄沒有找到則返回null。
6 int db_delete(dbhandle db, const char *key);//返回值:若成功則返回0, 若記錄沒有找到則返回-1。
7 void db_rewind(dbhandle db); //回滾到資料庫第一條記錄
8 char* db_nextrec(dbhandle db, char *key);//返回值:若成功則返回指向資料的指標,若到達資料庫的結尾則返回null
大多數訪問資料庫的函式庫使用兩個檔案來儲存資訊:乙個索引檔案和乙個資料檔案。資料庫實現結構如下圖所示:
索引檔案和資料檔案結構
3、集中式和非集中式
(1)集中式:由乙個程序作為資料庫管理者,所有的資料庫訪問工作由此程序完成,其他程序通過ipc機制與此中心程序進行聯絡。
(2)非集中式:每個函式庫獨立申請併發控制(加鎖),然後呼叫自己的i/o函式。呼叫資料庫庫函式執行i/o操作的使用者程序是合作程序,使用位元組範圍鎖機制實現併發訪問。
非集中式避免使用ipc機制,速度一般比集中式要快。集中式的優點是能夠根據需要來對操作模式進行調整,恢復要比非集中式方法容易。
4、併發
(1)粗鎖(coarse-grained locking):將索引檔案和資料檔案中的乙個作為整個資料庫的鎖,並要求呼叫者在對資料庫進行操作前必須獲得這個鎖。缺點是限制了最大程度的併發。
(2)細鎖(fine-grained locking):要求乙個讀程序或寫程序在操作一條記錄前必須先獲得此記錄所在雜湊鏈的讀鎖或寫鎖。允許對一條雜湊鏈同時可以有多個讀程序,而只能有乙個寫程序。另外,乙個寫程序在操作空閒區鍊錶(如dbdelete或dbstore)前,必須獲得空閒區鍊錶的寫鎖。最後,當dbstore向索引檔案或資料檔案加一條新記錄時,必須獲得對應檔案相應區域的寫鎖。
學習筆記 《MySQL必知必會》 第二十章
在update語句中使用子查詢 ignore關鍵字 如果用update語句更新多行,並且在更新這些行中的一行或多行時出乙個現錯誤,則整個update操作被取消 錯誤發生前更新的所有行被恢復到它們原來的值 為即使是發生錯誤,也繼續進行更新,可使用ignore關鍵字,刪除資料 delete delete...
高階shell程式設計筆記 第二十章 子shell
每個 shell 指令碼有效地執行在父 shell 的乙個子程序裡。這個父 shell 是指在乙個控制終端或在乙個 xterm 視窗中給你命令指示符的程序。shell 指令碼也能啟動他自已的子程序。這些子 shell 即子程序 使指令碼因為效率而同時進行多個子任務執行時能做序列處理。一般來說,指令碼...
第二十章 TCP的成塊資料流
使用tcp視窗協議時,接收方不必確認每乙個收到的分組。在tcp中,ack是累積的 它們表示接收方已經正確接收到了一直到確認序號減一的所有位元組 滑動視窗實際上是描述接收方tcp緩衝區大小的資料,傳送方根據這個計算自己可以傳送的資料大小。當接收方確認資料後,這個滑動視窗不斷向右移動。視窗兩個邊沿的相對...