c++是一門很複雜的語言,說它複雜是因為它難以控制的靈活性,但沒辦法,已經上了這條船,就暫且適應它複雜的規則。關於這門語言的細節的整理將集中在這篇文章裡。
為什麼是mysql的源碼?
主要原因是:
一、我想弄明白資料庫裡事務實現的原理,底層的組織和資料結構,而我所接觸到的資料都只告訴我我不感興趣的東西。顯然只能求助於開源的資料庫,mysql和sqlite都是很好的選擇。它們提供的代碼很豐富,雖然我從來沒用過這兩種資料庫。
二、sqlite的源碼是純c寫的,可讀性不敢恭維,一個函數可以寫X00行,很是嚇人。mysql則是c++風格,比較對我的胃口。
為什麼是選擇資料庫交易處理作為切入點而不是其它什麼七七八八的?
主要原因是,交易處理在檔案和資料庫操作中應用得都很廣泛,可見它的重要性。
(2008/12/20)friend
友元是一種定義在類外部的普通函數,但它需要在類體內進行說明,為了與該類的成員函數加以區別,在說明時前面加以關鍵字friend。友元不是成員函數,
但是它可以訪問類中的私人成員。友元的作用在於提高程式的運行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數可以訪問類的私人成員。
友元可以是一個函數,該函數被稱為友元函數;友元也可以是一個類,該類被稱為友元類。
友元函數的特點是能夠訪問類中的私人成員的非成員函數。友元函數從文法上看,它與普通函數一樣,即在定義上和調用上與普通函數一樣。
友元除了前面講過的函數以外,友元還可以是類,即一個類可以作另一個類的友元。當一個類作為另一個類的友元時,這就意味著這個類的所有成員函數都是另一個類的友元函數。
- //definition of NdbTransacion.
- // ../mysql-5.0.22/ndb/include/ndbapi/NdbTransaction.hpp
- class NdbTransaction
- {
- #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
- friend class Ndb;
- friend class NdbOperation;
- friend class NdbScanOperation;
- friend class NdbIndexOperation;
- friend class NdbIndexScanOperation;
- friend class NdbBlob; //binary large object
- #endif
- ....
- }
(2008/12/20) 事務(msdn)
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務。
-
原子性
-
事務必須是原子工作單元;對於其資料修改,要麼全都執行,要麼全都不執行。
-
一致性
-
事務在完成時,必須使所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。事務結束時,所有的內部資料結構(如 B 樹索引或雙向鏈表)都必須是正確的。
-
隔離
-
由並發事務所做的修改必須與任何其他並發事務所做的修改隔離。事務識別資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是第二個事
務修改它之後的狀態,事務不會識別中間狀態的資料。這稱為可串列性,因為它能夠重新裝載起始資料,並且重播一系列事務,以使資料結束時的狀態與原始事務執
行的狀態相同。
-
持久性
-
事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。
以上對事務的描述直接來自msdn的官方網站。以下觀點僅個人yy,不代表事實。
原子性
對於每個事務(原子工作單元)中都包含一系列操作序列,顯式的操作和隱式的操作,如顯示對錶進行增刪改操作,而隱式的操作則是對內部資料結構進行的調整,如增加刪除結點,維護樹的平衡性等。那麼在事務開始之前,必定會搜集即將要執行的操作序列,這些操作將以某種形式的資料結構被儲存下來,執行操作時,則回調這些操作對應的方法。
一致性
一致性是否意味著在事務開始前,將儲存下本次事務的所有操作所涉及的相關資料的所有狀態,事務如果成功結束,那麼,修改這些操作所涉及資料的狀態,否則,在復原時恢複原本的狀態?如果真的像我yy的那樣,那麼怎樣才能高效地儲存這些狀態,而這些狀態又應該以怎樣的資料形式被表示?
隔離性
通過鎖機制應該可以很好解決這個問題。
持久性
對系統的影響是持久的,我的理解是事務結束之後,不管是內部資料還是外部資料都將被儲存在持久型的資料容器(如硬碟)中。
yy完了,過一會兒看看mysql裡的事務相關聯的資料。
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-6496690-1";
urchinTracker();
</script>