MySQL加上事务处理等于MaxSQL_PHP教程
程序员文章站
2022-04-16 17:49:25
...
去年八月在 OReilly 赞助的开放源码大会上,MySQL 开发人员Monty Widenius 宣布了一项新的项目叫做MaxSQL,一个目前十分流行的MySQL 数据库的增强版本。最重要的是MaxSQL 结合了来自Sleepycat软件的最新的 Berkeley DB 库,因此程序以另外一种表类型支持事务处理。
目前,你还不能直接安装MaxSQL的二进制版本,你必须从MySQL 3.23 beta 的源码来编译,但是当你看到这篇文章的时候,你应该可以从MySQL 网站下载MaxSQL了。 想要自己编译最新的版本的话,请看“编译自己的MaxSQL”一文,在那里我详细叙述了编译步骤。
什么是事务?
为什么增加了一个事务安全的表需要命名一个新的项目名字呢?或许我应该提一下MySQL 的主要开发者 Monty Widenius 有两个孩子,一个叫My ,另一个叫Max,哥儿俩相互竞争不说,另外还有一个对手PostgreSQL。
关于PostgreSQL,我们本期的另外一篇文章"PostgreSQL为电子商务加了一个等级" 会有提到,是一个对我们都有利的竞争者,因为每一个项目组都在克服自己产品中的弱点。而MaxSQL 所作的就是消除这两个对手之间的 差距。MySQL 有很快的读操作,因此很受Web 开发者欢迎,因为Web 内容 以读为主。但是,另外一方面,因为MySQL 使用了ISAM 表,所以写操作时,必须给整个表加锁,这样减慢了更新和插入的操作,当流量很大时会是一个很大的问题。当每秒请求数目剧增时,写操作在服务器中排队,Web 页面会发生超时错误。
使用了 MaxSQL后,你依然可以建立普通的快速ISAM 类型表,也可以在某个表需要使用事务安全特性时,选择使用新的BDB 类型。
BDB 表在写操作时要比 ISAM 快得多。因为他们不使用表一级的锁。 另外,对于任何事务表的处理都有日志记录以防硬件失效。日志允许 COMMIT/ROLLBACK 操作。例如,你在一个在线商店下订单, 订单会在"order" 表中记录一行。系统会从"inventory"表中的某一行中 减掉对应的库存货物数量。如果使用MySQL的ISAM表,一个CGI 程序需要执行以下六步:
LOCK inventory table
LOCK order table
UPDATE inventory table
UPDATE order table
UNLOCK inventory table
UNLOCK order table
如果有人锁住了任何一个表,这个 CGI 程序就必须等待。一旦两个都加锁以后,CGI 才可以更新他们,然后释放锁。如果在第三步失败的话(例如服 务器宕机),order 表就不会被更新而你的库存已经减了下来。
使用 MaxSQL BDB 事务安全类型的表之后,只需要四步:
BEGIN
UPDATE inventory table
UPDATE order table
COMMIT
你不必等待释放锁,所有的四个步骤是一个事务。只要读到BEGIN 语句, MySQL 就把命令读入缓冲,一直到看到COMMIT 命令为止。因此,所有的操作在同一时间发生。即使有意外操作发生(磁盘满或者掉电),也不会因此而毁掉数据库。在一个非事务安全的系统里,如果第三步失败的话, 数据库就会发生不一致,而在BDB 表中,如果对order 表操作失败MySQL 会恢复对库存表的操作,这样不会发生不一致的情况了。
许多网站采用早期版本的 MySQL来实现表锁,但是采用 MaxSQL 以后,会很容易和快速。
还有什么新式武器?
除了因为 BDB 表需要把 MySQL 转变成 MaxSQL之外,另外还有一些 重要的改变。其中一个秘密武器就是数据库复制,你可以把一个服务器作为 主服务器,而配置任意数目的从服务器,这样对主服务器的更新也将拷贝到 从服务器。为了使用这样的系统,改变你的CGI 脚本,让他们知道MySQL 从 服务器的存在。这个脚本也会在不能连接上主服务器时,切换到从服务器。
需要注意的是,这样的系统对很少写操作的数据库才有效,因为复制不是同步的。如果有人在主服务器上启动一个事务,而在事务结束之前服务器死机的话,主服务器没有时间把更新复制到从服务器。这样,这种系统不合适作电子商务,而且,CGI 脚本总是首先连接主服务器,所以不是负载平衡的系统。
另外一个重大改进是 ISAM 类型表的格式。缺省的表类型现在叫作 MyISAM。 这种类型的表能处理到每个表最大2GB ,而且可以跨平台。 你可以从Linux 拷贝一个MyISAM 文件到Solaris 而不需要任何转换。
结论:
MaxSQL 可以作为价格昂贵的商务系统的一个很优秀的替代品。很多系统不需要处理很多的事务交易,而要求安装Oracle。而MaxSQL 提供的事务安全的表,使更新数据库的编程工作更加轻松。
目前,你还不能直接安装MaxSQL的二进制版本,你必须从MySQL 3.23 beta 的源码来编译,但是当你看到这篇文章的时候,你应该可以从MySQL 网站下载MaxSQL了。 想要自己编译最新的版本的话,请看“编译自己的MaxSQL”一文,在那里我详细叙述了编译步骤。
什么是事务?
为什么增加了一个事务安全的表需要命名一个新的项目名字呢?或许我应该提一下MySQL 的主要开发者 Monty Widenius 有两个孩子,一个叫My ,另一个叫Max,哥儿俩相互竞争不说,另外还有一个对手PostgreSQL。
关于PostgreSQL,我们本期的另外一篇文章"PostgreSQL为电子商务加了一个等级" 会有提到,是一个对我们都有利的竞争者,因为每一个项目组都在克服自己产品中的弱点。而MaxSQL 所作的就是消除这两个对手之间的 差距。MySQL 有很快的读操作,因此很受Web 开发者欢迎,因为Web 内容 以读为主。但是,另外一方面,因为MySQL 使用了ISAM 表,所以写操作时,必须给整个表加锁,这样减慢了更新和插入的操作,当流量很大时会是一个很大的问题。当每秒请求数目剧增时,写操作在服务器中排队,Web 页面会发生超时错误。
使用了 MaxSQL后,你依然可以建立普通的快速ISAM 类型表,也可以在某个表需要使用事务安全特性时,选择使用新的BDB 类型。
BDB 表在写操作时要比 ISAM 快得多。因为他们不使用表一级的锁。 另外,对于任何事务表的处理都有日志记录以防硬件失效。日志允许 COMMIT/ROLLBACK 操作。例如,你在一个在线商店下订单, 订单会在"order" 表中记录一行。系统会从"inventory"表中的某一行中 减掉对应的库存货物数量。如果使用MySQL的ISAM表,一个CGI 程序需要执行以下六步:
LOCK inventory table
LOCK order table
UPDATE inventory table
UPDATE order table
UNLOCK inventory table
UNLOCK order table
如果有人锁住了任何一个表,这个 CGI 程序就必须等待。一旦两个都加锁以后,CGI 才可以更新他们,然后释放锁。如果在第三步失败的话(例如服 务器宕机),order 表就不会被更新而你的库存已经减了下来。
使用 MaxSQL BDB 事务安全类型的表之后,只需要四步:
BEGIN
UPDATE inventory table
UPDATE order table
COMMIT
你不必等待释放锁,所有的四个步骤是一个事务。只要读到BEGIN 语句, MySQL 就把命令读入缓冲,一直到看到COMMIT 命令为止。因此,所有的操作在同一时间发生。即使有意外操作发生(磁盘满或者掉电),也不会因此而毁掉数据库。在一个非事务安全的系统里,如果第三步失败的话, 数据库就会发生不一致,而在BDB 表中,如果对order 表操作失败MySQL 会恢复对库存表的操作,这样不会发生不一致的情况了。
许多网站采用早期版本的 MySQL来实现表锁,但是采用 MaxSQL 以后,会很容易和快速。
还有什么新式武器?
除了因为 BDB 表需要把 MySQL 转变成 MaxSQL之外,另外还有一些 重要的改变。其中一个秘密武器就是数据库复制,你可以把一个服务器作为 主服务器,而配置任意数目的从服务器,这样对主服务器的更新也将拷贝到 从服务器。为了使用这样的系统,改变你的CGI 脚本,让他们知道MySQL 从 服务器的存在。这个脚本也会在不能连接上主服务器时,切换到从服务器。
需要注意的是,这样的系统对很少写操作的数据库才有效,因为复制不是同步的。如果有人在主服务器上启动一个事务,而在事务结束之前服务器死机的话,主服务器没有时间把更新复制到从服务器。这样,这种系统不合适作电子商务,而且,CGI 脚本总是首先连接主服务器,所以不是负载平衡的系统。
另外一个重大改进是 ISAM 类型表的格式。缺省的表类型现在叫作 MyISAM。 这种类型的表能处理到每个表最大2GB ,而且可以跨平台。 你可以从Linux 拷贝一个MyISAM 文件到Solaris 而不需要任何转换。
结论:
MaxSQL 可以作为价格昂贵的商务系统的一个很优秀的替代品。很多系统不需要处理很多的事务交易,而要求安装Oracle。而MaxSQL 提供的事务安全的表,使更新数据库的编程工作更加轻松。
推荐阅读
-
php下pdo的mysql事务处理应用实例_PHP教程
-
解析php mysql 事务处理回滚操作(附实例)_PHP教程
-
PHP与MYSQL事务处理,PHPMYSQL事务处理_PHP教程
-
php下pdo的mysql事务处理应用实例_PHP教程
-
php实现mysql事务处理的方法,phpmysql事务处理_PHP教程
-
PHP+Mysql基于事务处理实现转账功能的方法,mysql事务处理_PHP教程
-
php下pdo的mysql事务处理用法实例,pdomysql_PHP教程
-
php mysql 事务处理实现程序_PHP教程
-
php实现mysql事务处理的方法,phpmysql事务处理_PHP教程
-
MySQL加上事务处理等于MaxSQL_PHP教程