我是题外话
最近在用Realm数据库,然后就对事务的概念又重新的认知了一下,下面先使用系统提供的SQLite来应用一下,后续更新
事务(Transaction)概念
- 定义:指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作单元需要具有原子性, 一致性,隔离性和持久性四个属性,统称为ACID特性。
- 是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转账工作:从一个账号扣款并使另一个账号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。
- 事务是一种机制,用以维护数据库的完整性。
事务基本特征。
- Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。
- Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。
- Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。
- Durability(持久性):事务结束后,事务处理的结果必须能够得到固化。
事务属性
- 原子性(Atomicity):事务中的所有元素作为一个整体提交或回滚,事务的个元素是不可分的,事务是一个完整操作。
- 一致性(Consistemcy):事物完成时,数据必须是一致的,也就是说,和事物开始之前,数据存储中的数据处于一致状态。保证数据的无损。
- 隔离性(Isolation):对数据进行修改的多个事务是彼此隔离的。这表明事务必须是独立的,不应该以任何方式以来于或影响其他事务。
- 持久性(Durability):事务完成之后,它对于系统的影响是永久的,该修改即使出现系统故障也将一直保留,真实的修改了数据库
事务语句
- 开始事物:BEGIN TRANSACTION
- 提交事物:COMMIT TRANSACTION
- 回滚事务:ROLLBACK TRANSACTION
- (void)openDB {
// 如果数据库已经打开,没有必要再打开一次.
if (db) {
return;
}
// 创建数据库文件的路径
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"Student.sqlite"];
int result = sqlite3_open(filePath.UTF8String, &db);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功!");
} else {
NSLog(@"数据库打开失败,错误码:%d", result);
}
}
- (void)insertData:(id)obj useTransaction:(BOOL)useTransaction
{
[self openDB];
NSString *uid = [NSString stringWithFormat:@"%d",[obj valueForKey:@"uid"]];
NSString *name = [[NSString alloc] initWithFormat:@"%@",[obj valueForKey:@"uid"]];
NSString *sql = @"INSERT INTO person(uid,name) VALUES (?,?)";
if (useTransaction) {
// 开启事务后这里可以做一系列操作。。
[db beginTransaction];
BOOL isRollBack = NO;
@try {
BOOL success = [db executeUpdate:sql,uid,name];
if (!success) {
NSLog(@"插入失败");
}
}
}
@catch (NSException *exception) {
// 如果失败,回滚事务
isRollBack = YES;
[db rollback];
}
@finally {
// 如果成功,提交事务
if (!isRollBack) {
[db commit];
}
}
}else{
BOOL success = [db executeUpdate:sql,uid,name];
if (!success) {
NSLog(@"插入失败");
}
}
}
[self closeDB];
}
- (BOOL)closeDB{
return [db close];
}