应用场景1:某些业务,必须全部执行完成,不能单独执行其中的一部分,比如转账操作,A账户扣款,B账户到账必须全部执行,如果其中一个操作失败,就需要回复到最初的状态。
相关概念
- start transaction 或者 begin,作用是显式开启一个事务。
- commit:提交事务。当提交事务后,对数据库的修改是永久性的。
- rollback 或者 rollback to [savepoint],意为回滚事务。意思是撤销正在进行的所有没有提交的修改,或者将事务回滚到某个保存点。
- savepoint:在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可以存在多个保存点。
- release savepoint:删除某个保存点。
- set transaction,设置事务的隔离级别。
- set autocommit =1; //开启自动提交
- SET @@completion_type = 1;// 当提交了一个事务后,自动开启一个同相同隔离级别的事务,相当于执行了 COMMIT AND CHAIN。
数据库操作的异常情况分别为脏读(Dirty Read)、不可重复读(Nonrepeatable Read)和幻读(Phantom Read)。
异常
脏读:读取到了事务未提交的数据,然后事务撤回了,导致读取到的是脏数据。
不可重复读:通过事务提交数据的修改,短时间内读取同一行数据结果不同,读取到的数据的值发生了改变。
幻读:通过事务提交数据,短时间内数据的个数发生改变。读取到的数据数量发生了改变。
异常产生的原因在于:SQL 语句本身并不能保证对数据行的读取或修改是原子的,并发操作共享数据就有可能会出现异常。我们可以利用事务的原子性来避免这些问题。这也是事务的应用场景2。
这就涉及到事务的隔离级别:
隔离级别越低,意味着系统吞吐量(并发程度)越大,但同时也意味着出现异常问题的可能性会更大。在实际使用过程中我们往往需要在性能和正确性上进行权衡和取舍,没有完美的解决方案,只有适合与否。
这四种隔离级别从低到高分别是:读未提交(READ UNCOMMITTED )、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和可串行化(SERIALIZABLE)。

游标
游标就是指向数据行的指针,打开游标的时候它会创建一个临时的结果集,并指向第一行,可以通过移动指针来更好的控制访问数据。
FMDB中也用到了游标,
FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM myTable"];
while ([resultSet next]) {
}
网友评论