Mysql事务和原子操作

MySQL服务器(3.23至该系列的最高版本,所有4.0版本,以及更高版本)支持采用InnoDB和BDB事务存储引擎的事务。InnoDB提供了全面的ACID兼容性。

MySQL服务器中的其他非事务性存储引擎(如MyISAM)遵从不同的数据完整性范例,称之为“原子操作”。按照事务术语,MyISAM表总能高效地工作在AUTOCOMMIT=1模式下。原子操作通常能提供可比较的完整性以及更好的性能。

由于MySQL服务器支持两种范例,因而你能决定是否利用原子操作的速度更好地服务于你的应用程序,或使用事务特性。该选择可按表进行。

正如所阐述的那样,事务性和非事务性表类型之间的权衡主要取决于性能。事务性表对内存和磁盘空间的要求更高,CPU开销也更大。另一方面,多种事务性表类型,如InnoDB,也能提供很多显著特性。MySQL服务器的模块化设计允许同时使用不同的存储引擎,以满足不同的要求,并在所有情形下,提供最佳性能。

但是,即便使用非事务性MyISAM表,你将如何使用MySQL服务器的特性来保持严格的完整性呢?这些特性与事务性表类型相比又如何呢?

1. 如果应用程序采用了特定的编写方式,依赖于在关键情况下能够调用ROLLBACK而不是COMMIT,那么事务性类型更方便。使用事务,还能确保未完成的更新或崩溃的活动不被提交到数据库,能为服务器提供自动回滚的机会,并保存你的数据库。

如果使用非事务性表,MySQL服务器几乎在所有情况下均允许你解决潜在的问题,方式是在更新前进行简单检查,并运行检查数据库一致性的简单脚本,如果出现不一致性,该脚本能自动修复它或给出告警。注意,仅使用MySQL日志或增加额外日志,通常能完美地更正表,同时不会造成数据完整性损失。

2. 在很多情况下,能够对关键的事务更新进行重写,使之成为“原子”类型。一般而言,所有由事务解决的完整性问题均能用LOCK TABLES或原子更新解决,从而确保了服务器不会自动中断,后者是事务性数据库系统的常见问题。

3. 为了安全使用MySQL服务器,无论是否使用事务性表,仅需启用备份和二进制日志功能。这样,你就能解决使用其他事务性数据库系统时遇到的任何问题。无论使用的数据库系统是什么,启用备份总是个好主意。

事务范型有自己的优点和不足之处。很多用户和应用程序开发人员喜欢这类简单性,在出现问题时或必要时,通过代码解决问题。但是,即使你是原子操作范型的新手,或更熟悉事务,也请考虑非事务性表的速度益处,与经过优化调整的最快的事务性表相比,它的速度快3~5倍。

在完整性具有最高重要性的情况下,即使是对非事务性表,MySQL也能提供事务级别的可靠性和安全性。如果使用LOCK TABLES锁定了表,所有更新均将被暂时中止直至完整性检查完成。如果你获得了对某一表的READ LOCAL锁定(与写锁定相对),该表允许在表尾执行并行插入,当其他客户端执行插入操作时,允许执行读操作。新插入的记录不会被有读锁定属性的客户端看到,直至解除了该锁定为止。使用INSERT DELAYED,能够将插入项置于本地队列中,直至锁定解除,不会让客户端等待插入完成。

从我们赋与其名称的意义上,“原子”绝非不可思议的。它仅意味着,你能确信在每个特性更新运行的同时,其他用户不能干涉它,而且不会出现自动回滚(如果你不小心,对于事务性表,这种情况可能发生)。MySQL服务器还能保证不存在脏读。

下面列出了使用非事务性表的一些技术:

· 对于需要事务的循环,通常能使用LOCK TABLES进行编码,不需要光标来更新正在处理的记录。

· 要想避免使用ROLLBACK,可采取下述策略:

1. 使用LOCK TABLES锁定所有希望访问的表。

2. 执行更新前,测试必须为真的条件。

3. 如果一切正常,执行更新。

4. 使用UNLOCK TABLES解除锁定。

与使用具有回滚可能性的事务性表相比,它通常具有更快的速度,虽然并非始终如此。该解决方案唯一不能处理的情形是,在更新中途杀死了线程。在这种情况下,将释放所有锁定,但某些更新可能尚未执行。

◆也可以使用函数在单一操作中更新记录。采用下述技术,能获得效率很高的应用程序。

◆根据其当前值更改列。

◆仅更新出现实际变化的列。

时间: 2024-09-28 11:46:09

Mysql事务和原子操作的相关文章

mysql事务回滚使用与常见问题介绍

方法如下: 1.修改c:appservmysqlmy.ini文件,找到skip-InnoDB,在前面加上#,后保存文件. 2.在运行中输入:services.msc,重启mysql服务. 3.到phpmyadmin中,mysql->show engines;(或执行mysql->show variables like 'have_%'; ),查看InnoDB为YES,即表示数据库支持InnoDB了. 也就说明支持事务transaction了. 4.在创建表时,就可以为Storage Engin

MySQL事务数据库(InnoDB类型)的安装方法

mysql|数据|数据库 MySQL数据库分二种类型,一种是传统的数据表格式,一种是支持事务处理的数据表格式(InnoDB,BDB,其中以InnoDB为主),下面我介绍一下关于MySQL事务处理数据库的安装及使用方法你先要去下载一下Mysql max版的安装程序,下载地址:www.mysql.com按常规的方法进行安装安装完成后,启动mysql\bin\WinMySQLadmin再退出运行mysql\bin\mydqld-nt --removemysql\bin\mysqld-max-nt --

MySQL 4.1.0 中文参考手册 --- 6.7 MySQL 事务与锁定命令

mysql|参考|参考手册|中文 MySQL 4.1.0 中文参考手册 --- 犬犬(心帆)翻译 MySQL Reference Manual for version 4.1.0-alpha. 6.7 MySQL 事务与锁定命令6.7.1 BEGIN/COMMIT/ROLLBACK 句法 缺省的,MySQL 运行在 autocommit 模式.这就意味着,当你执行完一个更新时,MySQL 将立刻将更新存储到磁盘上. 如果你使用事务安全表 (例如 InnoDB.BDB),通过下面的命令,你可以设置

安装MySQL事务数据库(InnoDB)

    MySQL数据库分二种类型,一种是传统的数据表格式,一种是支持事务处理的数据表格式(InnoDB,BDB,其中以InnoDB为主),下面我介绍一下关于MySQL事务处理数据库的安装及使用方法 你先要去下载一下Mysql max版的安装程序,下载地址:www.mysql.com 按常规的方法进行安装 安装完成后,启动mysqlbinWinMySQLadmin 再退出 运行 mysqlbinmydqld-nt --remove mysqlbinmysqld-max-nt --install

mysql事务特性实现并发安全的自增ID示例

 项目中经常会用到自增id,比如uid,下面为大家介绍下利用mysql事务特性实现并发安全的自增ID,感兴趣的朋友可以参考下 项目中经常会用到自增id,比如uid,最简单的方法就是用直接用数据库提供的AUTO_INCREMENT,但是如果用户量非常大,几千万,几亿然后需要分表存储的时候呢,这种方案就搞不定了,所以最好有一个全局的自增ID的生成器,不管是否分表,都能从生成器中获取到全局自增的ID.    实现方法应该有很多,不过所有的方案都需要解决一个问题,就是保证在高并发的情景下,数据获取依然正

基于mysql事务、视图、存储过程、触发器的应用分析_Mysql

一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理. 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码 代码如下: begin 开始一个事务rollback   事务回滚commit    事务确认 (2)直接用set来改变mysql的自动提交模式 复制代码 代码如下: set autocommit=0 禁止自动提交set autocommit=1 开启自动提交 demo 复制代码 代码如下: header("Content-t

MySQL事务内幕与ACID

       MySQL的事务实现严格遵循ACID特性,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability).为了避免一上来就陷入对ACID的概念理解,我们直接先谈MySQL事务实现机制.             MySQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster.另外还有一些第三方存储引擎也支持事务,比较知名的包括XtraDB和PBXT.下面以InnoDB来说明.             MySQ

MySQL事务隔离级别介绍及设置

READ UNCOMMITTED(未提交) 即使没有提交,对其它事务也可见.未提交的数据会引起脏读(Dirty Read). 测试流程: 1.A设置read-uncommitted, start transaction 2.B执行start transaction,修改一条记录, 3.A查询记录,得到了以为正确的记录 4.B回滚. 问题:A读到了B没有提交的记录,也就是脏读. READ COMMITTED(提交读) 一个从开始直到提交之前所做的任何修改对其它事务都是不可见的.两次同样的查询可能会

PHP使用Mysql事务实例解析_php技巧

本文实例讲解了PHP使用MySQL事物的实例,并备有注释加以详细说明.分享给大家供大家参考之用. 具体实例如下所示: <?php //数据库连接 $conn = mysql_connect('localhost', 'root', ''); mysql_select_db('test', $conn); mysql_query("SET NAMES GBK"); /* 支持事务的表必须是InnoDB类型 一段事务中只能出现一次: mysql_query('START TRANSA