注意:这篇文档写于2000年5月。因此,它并不能说明mysql的最新特性。但从中我们仍然可以了解rdbms的一些基本概念、原理,从而在实践中更好地应用数据库,同时也才能对一些不实的炒作保持必要的警惕。
为何不用mysql?
作者:ben adida 译者:马维达
几乎每周、有时甚至更为频繁,总有人会问我们为何不采用mysql作为openacs的rdbms(关系式数据库管理系统)。acs classic team(arsdigita)也一再地在他们的论坛上遇到同样的提问。如果mysql对于slashdot来说足够好的话,它也一定能够用于openacs,不是吗?
不对。 这篇简短的论文将尝试解释为何mysql不仅对openacs来说是错误的选择,它也不应被用于任何处理关键数据的系统。
rdbms的目的
rdbms的目的是提供一种可靠的永久存储机制,在acid测试中具体表述了这种机制的非常严格的特性。我将直接引用philip greenspun的精彩解释(以oracle作为rdbms的代表):
原子性(atomicity)
事务的执行结果或者被全部提交、或者被全部回滚(roll back)。要么所有的变动都生效,要么就没有变动生效。假定一个用户正在编辑一条注释,web脚本告诉数据库“将旧注释值拷贝到审计表中,并用新文本更新活动表”。如果在拷贝之后、更新之前硬盘变满的话,审计表插入就将被回滚。
一致性(consistency)
数据库从一种有效状态转换到另一种有效状态。仅在服从用户定义的完整性约束时,一个事务才是合法的。不允许非法的事务,而且,如果不能满足某完整性约束的话,该事务会被回滚。例如,假定你定义了一条规则:论坛表中的帖子必须与有效的用户id相关联。然后你雇用了joe novice来编写管理页面。joe编写了一个删除用户页面,它不会检查删除是否会产生一些无主的论坛帖子。然而像oracle这样的rdbms将会进行检查,并中止任何事务,如果它产生的论坛帖子为已被删除的用户所拥有的话。
隔离性(isolation)
一个事务的结果对于其他事务是不可见的,直到该事务完成为止。例如,假定你有一个显示新用户和他们的照片的页面。按照出版者的要求,在页面中每个用户都有一张面部照片,如果用户没有照片的话就显示一幅表示无照片的图像。在新用户jane在你的站点注册的同时,老用户bill正在查看新用户页面。处理jane的注册的脚本会对若干表进行插入:users、mugshots、users_demographics。如果jane的面部照片很大的话,上述插入可能会需要一些时间。如果bill的查询在jane的事务提交之前开始的话,bill根本不会在他的新用户页面上看到jane,即使在jane的事务中,对某些表的插入已经完成。
持久性(durability)
一旦提交(完成),事务的结果将是永久性的,并能免于未来的系统和介质故障。假设你的电子商务系统将来自某消费者的定单插入数据库表中,并指示cybercash收取该消费者500美元的费用。突然间,在你的服务器收到cybercash的回复之前,有人绊掉了机器的电源线。在这样的情况下,oracle将不会忘记该定单。而且,如果有程序员将咖啡洒进了磁盘驱动器中,安装一个新磁盘,并将事务回复到咖啡泼洒时为止是可能的;数据将显示你曾试图收取某人500美元,并且还不清楚在cybercash那里发生了什么。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器