新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > MySQL教程 > 正文:细化解析:带你轻松接触事务和原子操作

细化解析:带你轻松接触事务和原子操作

新客网 XKER.COM 2007-10-18 来源: limeinan 收藏本文

 

 

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

 

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

 

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

 

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

 

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

 

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

 

4. 使用UNLOCK TABLES解除锁定。

 

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

 

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

◆根据其当前值更改列。

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

 

例如,当我们更新某些客户信息时,仅更新已更改的客户数据,与原始行相比,仅测试已更改的数据或依赖于已更改数据的数据是否未出现变化。对于已更改数据的测试,它是通过UPDATE语句的WHERE子句完成的。如果记录未更新,将向客户端发出消息: “一些你改变的数据已被其他用户更改”。接下来,我们在窗口中给出了旧行和新行,以便用户决定使用哪个版本。

 

这给出了与列锁定类似的结果,但效果更好,使用相对于其当前值的值,仅更新了某些列。这意味着,典型的UPDATE语句与下面给出的类似:

 

UPDATE tablename SET pay_back=pay_back+125; 
UPDATE customer
  SET    
customer_date='current_date',    
address='new address',    
phone='new phone',    
money_owed_to_us=money_owed_to_us-125  
WHERE    
customer_id=id AND address='old address' AND phone='old phone';

 

它很有效,即使其他客户端更改了pay_back或money_owed_to_us列中的值,也能使用。

 

·在很多情况下,用户希望将LOCK TABLES和/或ROLLBACK用于管理唯一ID。可以在不使用锁定功能或回滚的情况下,使用AUTO_INCREMENT列以及LAST_INSERT_ID() SQL函数或mysql_insert_id() C API函数。

我们通常能使用代码来处理行级锁定方面的需求。在某些情况下,实际上不需要它,InnoDB表支持行级锁定。通过MyISAM表,能够在表中使用标志列,并完成类似下面的操作:

 

UPDATE tbl_name SET row_flag=1 WHERE id=ID;

如果找到行,而且原始行中的row_flag不是1,对于受影响的行数,MySQL返回1。

你可以认为MySQL将前述查询更改为:

 

UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1;
共2页: 上一页 [1] [2] 下一页
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
发表评论
要记得去论坛讨论,点击注册新会员匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
阅读排行
随机推荐
实用信息推荐