热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yii1框架,事务使用方法

Yii1框架事务操作方法如下:$transactionYii::app()-db-beginTransaction();创建事务$transaction-co

Yii1框架事务操作方法如下:

$transaction= Yii::app()->db->beginTransaction();//创建事务
$transaction->commit();//提交事务
$transaction->rollback();//回滚事务

下面使用try,throw,catch配合使用事务:

1 // 以下实例将需要事务处理的操作放进try里
2 $transaction = Yii::app()->db->beginTransaction();
3 try {
4 $a = XXX::model()->findByPk(X);
5 $a->x = 1;
6 $a->setAttribute('字段名', '值')
7 //如果仅仅写为:$a->save(); 那么就算保存失败,也不会去执行catch里的内容8 if(!$a->save()){9 throw new CException('这里保存失败了,通知事务回滚');
10 }
11
12 $b = YYY::model()->findByPk(Y);
13 $b->y = 2;
14 $b->setAttribute('字段名', '值')
15 if(!$b->save()){
16 throw new CException('这里保存失败了,通知事务回滚');
17 }
18
19 //这里也可以调用其他方法,同样适用于事务,提交之前,对数据库的更改不可见23
24 $transaction->commit(); //提交事务会真正的执行数据库操作
25 } catch (Exception $e) {
26 //如果操作失败, 数据回滚
27 $transaction->rollback();
28 }

特别需要注意的是:我们之所以使用事务的目的,就是为了保证在一个代码块里面执行多个表的数据操作(新增,删除,修改)要么都成功,万事大吉,如果其中一个不成功,则撤销之前所有的操作,这里成功的意思不是指sql语句执行成功,而是说的相对应的数据操作要成功,该增加的要增加成功,该更新的要更新成功,该删除的要删除成功,当然了,如果在执行的过程中抛了异常,sql语句未执行成功,那最终执行影响成功的行数肯定是0。

在实际项目过程中,update table set 字段名 = 值 where id = 1,只要sql语句语法正确,但是id = 1 这条数据是不存在的,那么执行这条sql语句也是会成功的,只不过返回的影响的行数是0,所以我们在事务里面判断成不成功,不能以执行的结果为标准,而应该以执行成功影响的行数为标准。

例如一个事务里面要操作3个表的数据:

1 insert into table1 (字段1,字段2) values (值1,值2);(Affected rows: 1)
2 update table2 set 字段 = 值 where id = 1;(Affected rows: 0)
3 delete from table3 where id = 1;(Affected rows: 1)

单纯的执行这3个语句都是成功的,但是table2.id = 1 这条数据如果不存在,理论上要第二个更新语句成功了,才能执行第三个删除语句,所以就需要判断执行成功和影响的行数。


转载于:https://www.cnblogs.com/firstlady/p/10649320.html


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
胖儿的小金子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有