sqlite - flutter sqlite事务使用错误警告数据库已被锁定
问题描述
我正在开发一个使用 sqlite 和事务的移动应用程序。
下面的代码是使用 sqlite 事务保存模型从用户那里获取订单信息到多个数据库表。
Future<AppResult<int>> save(Order order) async {
Database db;
var dbReturn = BaseService();
try {
db = await databaseOpen();
int dbSaveResult = 0;
await db.transaction((txn) async {
var batch = txn.batch();
final List<Map<String, dynamic>> exist = await db.query(tableName, where: "id =?", whereArgs: [order.id]);
if (exist.length == 0) {
await _insert(order, txn, batch);
} else {
await _update(order, txn, batch);
}
await batch.commit(continueOnError: true).then((value) {
if (value.length > 0) dbSaveResult = value.length;
});
});
return dbReturn.success<int>(dbSaveResult, "Kaydedildi", 1, 1);
} on Exception catch (e) {
return dbReturn.failed<int>(-1, "OrderDbService -> save", 0, 0, e);
} finally {
if (db != null && db.isOpen) {
await db.close();
}
}
}
Future<void> _insert(Order order, Transaction txn, Batch batch) async {
try {
order = setEntityValue(order, false);
order = _setOrder(order, order.lines);
batch.insert(tableName, order.toMap(), conflictAlgorithm: ConflictAlgorithm.replace);
await _saveLines(order.lines, txn, batch);
await _saveDescriptions(order.descriptions, txn, batch);
await _saveDetail(order.detail, txn, batch);
await _saveDiscounts(order.discounts, txn, batch);
await _saveExchangeRates(order.exchangeRates, txn, batch);
} on Exception catch (e) {
throw e;
}
}
调用方法 sqlite 后抛出如下消息
D/Sqflite ( 8938): [57,main(2)] starting threadThread[Sqflite,5,main] priority 10
D/Sqflite ( 8938): [57,main(2)] opened 57 /data/user/0/com.tttt.mobileApp/databases/tttt.db
D/Sqflite ( 8938): [57,Sqflite(484)] opened 57 /data/user/0/com.tttt.mobileApp/databases/tttt.db
D/Sqflite ( 8938): [57,Sqflite(484)] BEGIN IMMEDIATE
I/flutter ( 8938): Warning database has been locked for 0:00:10.000000. Make sure you always use the transaction object for database operations during a transaction
解决方案
已解决: 确保您不在事务中使用 db 实例,如下所示
await db.query(tableName, where: "id =?", whereArgs: [order.id]);
而不是如下使用
await txn.query(tableName, where: "id =?", whereArgs: [order.id]);
Flutter 不会警告您任何事务使用错误。
推荐阅读
- json - Dynamics NAV Odata 请求返回 HTTP/1.1 415 Unsupported Media Type
- json - 如何将字符串反序列化为对象,然后在颤振中设置为泛型
- sql - 如何为日期文字使用绑定变量?
- database - 删除 Neo4j 中两个节点之间的重复节点
- swift - UICollectionViewCell 不是 UITableView 内的圆角
- java - 将 DecimalFormat 与 StringBuilder 一起使用
- python - Web Scraping w/BeautifulSoup4 - 如何过滤包含特定字符串的标签?
- ballerina - Ballerina 模块元数据文档?
- java - Java帮助异常处理
- javascript - JavaScript 可以验证用户是来自另一个网站还是直接来自另一个网站?