我将尝试使用FMDB sqlite iOS包装器进行交易.
文档对交易有点模糊,但从快速浏览一些功能我已经提出了以下逻辑:
[fmdb beginTransaction]; // Run the following query BOOL res1 = [fmdb executeUpdate:@"query1"]; BOOL res2 = [fmdb executeUpdate:@"query2"]; if(!res1 || !res2) [fmdb rollback]; else [fmdb commit];
解决方法
如果第一次失败,我不会尝试第二次更新.
bool ret = false; [fmdb beginTransaction]; ret = [fmdb executeUpdate:@"query1"]; if (ret) { ret = [fmdb executeUpdate:@"query2"]; if (!ret) { // report error 2 } } if(ret) { if (![fmdb commit]) { // panic! } } else { if (![fmdb rollback]) { // panic! } }
对于偏执狂的鲁棒性,你应该尝试… catch块,以防任何事情引起异常.如果你这样做,你可以利用它来获得优势.
[fmdb beginTransaction]; @try { if (![fmdb executeUpdate:@"query1"]) { // report error @throw someExcpetion; } if (![fmdb executeUpdate:@"query2"]) { // report error @throw someExcpetion; } [fmdb commit] } @catch(NSException* e) { [fmdb rollback]; // rethrow if not one of the two exceptions above }