Fork me on GitHub

MySQL 5.0和PostgreSQL 8.1

MySQL 5.0的发布已经有好些天了,添加了“企业应用”所需的特性,它终于支持存储过程和触发器了;不过,企业应用最大的需求之一,被很多初学者所忽略了的(这个现象来自对论坛的观察),是MySQL 5.0新增加的对分布式事务的支持:http://dev.mysql.com/doc/refman/5.0/en/xa.html,基于Open Group的XA规范。

最近又看到新闻,PostgreSQL 8.1也快发布了。在其RC1版本的Release Notes中,也看到了它新增的对XA的支持:http://developer.postgresql.org/docs/postgres/release.html#RELEASE-8-1。不知道这个算不算是PostgreSQL迫于MySQL的压力才推出的功能;对于数据库这样的产品,分布式事务的支持只能算一个基本功能,Oracle和SQL Server在很早以前就已经支持了,这实在不是什么新鲜玩意儿。只是这些开源数据库也开始支持这种关键功能,这应该可以成为真正挑战商业数据库的起点。

这些数据库实现XA规范时,也都采用了2PC的方式(2-Phase Commit)。也有一些产品采用了OMG的CORBA OTS规范,也有一些使用了XA规范但用的是一步提交(XA规范同时支持这两种方式)。然而,最流行的还是基于XA和2PC的方式。SQL Server,Oracle都已经支持(Sybase和DB2也支持XA 2PC,但我不确定它们的驱动也支持);MySQL和PostgreSQL也增加了对它的支持。

Windows和.NET对这种分布式事务(XA和2PC)也有着良好的支持。对于Windows Server 2003和Windows XP,可以简单的使用COM+ 1.5的无组件服务做到:

				
				
ServiceConfig scopeConfig = new ServiceConfig();
scopeConfig.Transaction = TransactionOption.Required; ServiceDomain.Enter(scopeConfig); try{ // business actions}catch(Exception e) { ContextUtil.SetAbort(); }finally{ ServiceDomain.Leave(); }

.NET 2.0的FCL有System.Transactions.TransactionScope类可用:http://msdn2.microsoft.com/en-us/library/system.transactions.transactionscope.aspx。用法更简单,而其背后也是通过ServiceDomain和COM+ 1.5实现的。

对于要求兼容Windows 2000的系统,则可以自己实现一个服务组件来做到这一点。如PetShop 3.0里面的例子,基本的代码看起来是这个样子:

				
				
[Transaction(TransactionOption.Required)]
public class BusinessComponent : ServicedComponent { [AutoComplete] public void BusinessProcess() { // business actions } }

在// business actions段,可以同时建立到多个数据库服务器的连接,数据库提供商也可不同,进行多步数据操作,并且保证这些操作是一个原子操作(实际上能保证所有四个ACID属性)。这就是分布式事务的威力,也是大型应用中必须实现的需求。

写到这里也许你已经打算用MySQL的.NET Connector试试MySQL的这个新功能了。不过还得再等等,MySQL是升级了,它的.NET Connector还没升级,开源社区看起来还是更喜欢Java(显然),因为Java版的Connector已经可以了。为新版PostgreSQL准备的.NET驱动也还在开发过程中。不过它们实现的分布式事务规范和COM+的相同,所以没有理由不支持,就看驱动的了。到时候,你是否也会考虑考虑使用这些开源的产品呢?

COM+也是个好东西,并且目前为止这是.NET下(COM+的托管包装见System.EnterpriseService命名空间)实现分布式事务的唯一途径。我刚加入Infosys不久,涉及到的两个.NET项目(一个B/S一个C/S)均使用了ES/COM+。得益于COM+服务良好的灵活性和可伸缩性,配合Windows Cluster Service,满足了客户苛刻的需求。

http://blog.joycode.com/sunmast/archive/2005/11/07/mysql_postgres_complus.aspx

posted @ 2006-03-29 21:07  张善友  阅读(938)  评论(0编辑  收藏  举报