面试题答案
一键面试处理数据库事务以确保数据一致性和完整性的方法
- 理解事务概念:事务是一组数据库操作,这些操作要么全部成功执行,要么全部失败回滚。在Flutter中使用SQLite进行数据操作时,通过事务可以保证在一系列操作中,如果其中某个操作失败,之前的操作不会对数据库产生部分影响,从而维护数据的一致性和完整性。
- 在封装方法中处理事务:
- 开始事务:调用
db.transaction
方法开启一个事务块。 - 执行操作:在事务块内编写需要执行的SQL操作,如插入、更新或删除等。
- 提交或回滚:如果所有操作都成功,通过
txn.commit
提交事务;如果有任何操作失败,通过txn.rollback
回滚事务,撤销之前的操作。
- 开始事务:调用
简单代码示例
假设我们有一个简单的数据库封装类DBHelper
,以下是包含事务处理的代码:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
class DBHelper {
static final DBHelper _instance = DBHelper._internal();
factory DBHelper() => _instance;
late Database _db;
Future<void> initDB() async {
String databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'test.db');
_db = await openDatabase(
path,
version: 1,
onCreate: (Database db, int version) async {
await db.execute('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)
''');
},
);
}
Future<void> performTransaction() async {
await _db.transaction((Transaction txn) async {
try {
// 插入操作1
await txn.rawInsert('INSERT INTO users (name, age) VALUES ("Alice", 25)');
// 插入操作2
await txn.rawInsert('INSERT INTO users (name, age) VALUES ("Bob", 30)');
// 如果所有操作成功,提交事务
await txn.commit();
} catch (e) {
// 如果有任何操作失败,回滚事务
await txn.rollback();
print('Transaction failed, rolled back: $e');
}
});
}
}
在上述代码中:
initDB
方法用于初始化数据库并创建一个users
表。performTransaction
方法展示了如何在事务中执行多个插入操作。如果两个插入操作都成功,事务将被提交;如果任何一个插入操作失败,事务将被回滚,确保数据库状态保持不变。