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
classNdbTransaction
{
#ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
friendclassNdb;
friendclassNdbOperation;
friendclassNdbScanOperation;
friendclassNdbIndexOperation;
friendclassNdbIndexScanOperation;
friendclassNdbBlob;//binary large object
#endif
....
}
(2008/12/20) 事务(msdn)
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
原子性
事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性
事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
隔离
由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事
务修改它之后的状态,事务不会识别中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执
行的状态相同。
持久性
事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
以上对事务的描述直接来自msdn的官方网站。以下观点仅个人yy,不代表事实。
原子性
对于每个事务(原子工作单元)中都包含一系列操作序列,显式的操作和隐式的操作,如显示对表进行增删改操作,而隐式的操作则是对内部数据结构进行的调整,如增加删除结点,维护树的平衡性等。那么在事务开始之前,必定会搜集即将要执行的操作序列,这些操作将以某种形式的数据结构被保存下来,执行操作时,则回调这些操作对应的方法。
一致性
一致性是否意味着在事务开始前,将保存下本次事务的所有操作所涉及的相关数据的所有状态,事务如果成功结束,那么,修改这些操作所涉及数据的状态,否则,在回滚时恢复原本的状态?如果真的像我yy的那样,那么怎样才能高效地保存这些状态,而这些状态又应该以怎样的数据形式被表示?
隔离性
通过锁机制应该可以很好解决这个问题。
持久性
对系统的影响是持久的,我的理解是事务结束之后,不管是内部数据还是外部数据都将被保存在持久型的数据容器(如硬盘)中。
yy完了,过一会儿看看mysql里的事务相关联的数据。
_uacct = "UA-6496690-1";
urchinTracker();