#pragma mark - 以队列的形式添加

// 以队列的形式添加数据FMDB比较常用的添加方式

// FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作

- (IBAction)insertManyStudent:(id)sender {

// 第一步:打开数据库

[self.dataBase open];

// 第二步:创建操作队列

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:self.filePath];

// 标识:记录是否操作成功

__block BOOL isSucceed = YES;

// 第三步:把所需要的事情打包放在队列中

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {

// 串行队列

isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"gblw", @38, @"nan"] && isSucceed;

isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"black", @22, @"nv"] && isSucceed;

isSucceed = [db executeUpdate:@"insert into t_student(name,age,sex) values(?,?,?)", @"-1", @69, @"nan"] && isSucceed;

// 如果有错误,就会将它返回

if (!isSucceed) {

// block返回的参数 rollback进行处理 (bool类型的指针)

*rollback = YES;

return ;

}

// rollback 回滚的意思。 就是数据库里做修改后( update ,insert , delete)未 commit 之前 使用 rollback 可以恢复数据到修改之前。

// 这句代码,假设在执行第一句执行完后,数据库服务器故障,抛出异常了,第二句就没有执行。这时候数据库的情况就是:id为1的name更新了,id为2的name没有更新。假设业务逻辑不能容忍这种只执行一半的情况,那么就应该rollback,把id为1的name恢复到一切执行之前的情况。

// 如果业务逻辑可以容忍这种只执行一半SQL的行为,那就不需要rollback。

// 数据库事务控制的精髓就一句话:对于一堆sql语句来说,要么都执行,要么都不执行。其中“要么都不执行”的部分,就是用rollback实现的

}];

[self.dataBase close];

}

rollback的作用的更多相关文章

  1. 存储开头结尾使用begin tran,rollback tran作用?

    BEGIN TRAN你就把它看成一个还原点,一般用在INSERT.UPDATE.DELETE等能改变数据操作前设置,如果操作后发现执行的结果和预期的不一样,就ROLLBACK,反之就COMMIT提交

  2. Can't call commit when autocommit=true(转)

    java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...

  3. python对mysql数据库操作的三种不同方式

    首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...

  4. MySQL/MariaDB中的事务和事务隔离级别

    本文目录:1.事务特性2.事务分类 2.1 扁平事务 2.2 带保存点的扁平事务 2.3 链式事务 2.4 嵌套事务 2.5 分布式事务3.事务控制语句4.显式事务的次数统计5.一致性非锁定读(快照查 ...

  5. 数据库并发控制及SQL Server的并发控制机制

    在多用户和网络环境下,数据库是一个共享资源,多个用户或应用程序同时对数据库的同一数据对象进行读写操作,这种现象称为对数据库的并发操作.显然并发操作可以充分利用系统资源,提高系统效率.虽然如此,但是如果 ...

  6. TP5数据库操作方法

    一.TP5数据库操作方法 1.name()方法作用 : 指定默认的数据表名(不含前缀)示例 : Db::name(‘weiba_post’);返回 : Db对象 2.setTable()方法作用 : ...

  7. mysql java.sql.SQLException: Can't call commit when autocommit=true

    java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...

  8. 【Mysql】—— 报错:Can't call commit when autocommit=true

    java.sql.SQLException: Can't call commit when autocommit=true at com.mysql.jdbc.SQLError.createSQLEx ...

  9. TP5数据库操作方法总结

    一.TP5数据库操作方法 1.name()方法        作用 : 指定默认的数据表名(不含前缀)        示例 : Db::name('weiba_post');        返回 : ...

随机推荐

  1. 使用python抓取知乎日报的API数据

    使用 urllib2 抓取数据时,最简单的方法是: import urllib2, json def getStartImage(): stream = urllib2.urlopen('http:/ ...

  2. Node.js模块os

    OS 操作系统模块 os.hostname() 操作系统的主机名. os.type() 操作系统的名称 os.release() 操作系统的发行版本 os.uptime() 当前系统的时间 以秒为 o ...

  3. js页面loading加载

    <html>     <head>     <title>页面正在载入</title>       <script  language=" ...

  4. asp.net发布网站(转)

    1.         在Web项目中点击发布网站,如图1所示 图1 2.         选择要发布的路径——>“确定”,如果项目显示发布成功就可以了.如图2所示 图2 3.         打 ...

  5. 使用Notepad++快速有效删除复制代码中的行号

    转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...

  6. 安装cocopods 更新ruby

    最近弄cocoapods出现如标题提示  So度娘一番.感谢作者.纯属学习没有商业用途 1.打开终端 终端输入  $ruby -v  查看ruby的版本 打印代码: ruby 2.0.0p648 (2 ...

  7. linux基础命令整理

    1  显示当前工作目录                pwd 2  查看目录下的所有内容          ls        ls   -l   以列方式查看        ls  -a  显示所有 ...

  8. 8.PHP 教程_PHP字符串

    字符串变量用于存储并处理文本. PHP中的字符串变量 字符串变量用于包含有字符的值. 在创建字符串之后,我们就可以对它进行操作了.您可以直接在函数中使用字符串,或者把它存储在变量中. 在下面的实例中, ...

  9. linux(ubuntu) 遇到的问题 --1

    1.使用sudo提示用户不在sudoers文件中的解决方法 切换到root用户 su root 查看/etc/sudoers文件权限,如果只读权限,修改为可写权限 [root@localhost ~] ...

  10. jQuery File Upload 插件 php代码分析

    jquery file upload php代码分析首先进入构造方法 __construct() 再进入 initialize()因为我是post方式传的数据  在进入initialize()中的po ...