面试题答案
一键面试- 开始事务:
- 使用
Database
对象的transaction
方法开始一个事务。该方法接受一个回调函数,在这个回调函数中编写事务内的数据库操作。
- 使用
- 提交事务:
- 在事务回调函数内,如果所有操作都成功,无需额外的显式提交语句。当回调函数正常返回(没有抛出异常)时,事务会自动提交。
- 回滚事务:
- 如果在事务回调函数内抛出异常,事务会自动回滚。
以下是一个简单的代码示例:
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
Future<void> main() async {
// 打开数据库
final String databasesPath = await getDatabasesPath();
final String path = join(databasesPath, 'test.db');
Database database = await openDatabase(
path,
version: 1,
onCreate: (Database db, int version) async {
await db.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
},
);
try {
await database.transaction((txn) async {
// 插入数据
await txn.rawInsert('INSERT INTO users (name) VALUES ("John")');
await txn.rawInsert('INSERT INTO users (name) VALUES ("Jane")');
// 如果这里没有抛出异常,事务会自动提交
});
print('事务成功提交');
} catch (e) {
print('事务回滚: $e');
} finally {
// 关闭数据库
await database.close();
}
}