上一篇
安卓开发之数据库事务的使用
- 行业动态
- 2025-04-22
- 5
数据库事务基础概念
术语 | 说明 |
---|---|
事务(Transaction) | 一组不可分割的数据库操作单元,保证ACID特性(原子性、一致性、隔离性、持久性) |
ACID特性 | Atomic(原子性):操作要么全部成功要么全部失败 Consistency(一致性):事务前后数据保持一致 Isolation(隔离性):事务间相互独立 Durability(持久性):事务结果永久保存 |
安卓支持 | 通过SQLiteDatabase 类提供事务管理接口 |
事务使用场景
- 批量数据操作
需要插入/更新/删除多条数据时,用事务包裹可显著提升性能 - 复杂业务逻辑
涉及多个表关联操作时,保证数据一致性 - 敏感数据修改
如银行转账场景,需保证转出和转入操作原子性
Android中事务实现步骤
// 1. 获取可写数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); // 2. 开启事务 db.beginTransaction(); try { // 3. 执行多条数据库操作 ContentValues values1 = new ContentValues(); values1.put("name", "Alice"); db.insert("users", null, values1); ContentValues values2 = new ContentValues(); values2.put("name", "Bob"); db.insert("users", null, values2); // 4. 事务成功,提交 db.setTransactionSuccessful(); } catch (Exception e) { // 5. 发生异常,回滚 e.printStackTrace(); } finally { // 6. 结束事务 db.endTransaction(); }
关键注意事项
风险点 | 解决方案 |
---|---|
忘记提交事务 | 必须调用setTransactionSuccessful() 才能生效 |
未处理异常导致回滚 | 用try-catch包裹事务代码,捕获异常时自动回滚 |
长时间持有事务锁 | 避免在事务中执行耗时操作(如网络请求),建议拆分事务或异步处理 |
多线程并发访问 | SQLite默认支持多线程读写,但建议通过ContentProvider 统一管理数据库访问 |
性能对比实验
操作类型 | 无事务(单条执行) | 事务(批量执行) |
---|---|---|
插入1000条数据 | 约12秒 | 约0.5秒 |
更新500条数据 | 约8秒 | 约0.3秒 |
删除200条数据 | 约3秒 | 约0.1秒 |
性能原理:事务将多次磁盘IO合并为一次,显著降低系统开销
常见问题与解答
问题1:事务中发生异常会怎样?
解答:
当在beginTransaction()
和endTransaction()
之间发生未捕获异常时,事务会自动回滚,建议始终使用try-catch
结构:
db.beginTransaction(); try { // 执行数据库操作 } catch (Exception e) { // 异常处理逻辑 } finally { db.endTransaction(); // 自动回滚未提交的事务 }
问题2:如何判断事务是否提交成功?
解答:
调用setTransactionSuccessful()
后,事务标记为成功状态,最终通过endTransaction()
内部判断是否真正提交:
- 如果调用过
setTransactionSuccessful()
,则提交事务 - 否则回滚事务
可通过日志或回调机制监控事务状态,但SQLite API本身不提供直接的成功/失败回调