事务(Transaction)是数据库操作的最小执行单元,具有 ACID 特性:
安卓通过 SQLiteDatabase
类提供事务支持,核心方法包括:
beginTransaction()
setTransactionSuccessful()
+ endTransaction()
endTransaction()
(未调用 setTransactionSuccessful
时自动回滚)// 获取可写数据库 SQLiteDatabase db = dbHelper.getWritableDatabase(); try { db.beginTransaction(); // 执行多条数据库操作 db.insert(...); db.update(...); // 标记事务成功 db.setTransactionSuccessful(); } catch (Exception e) { // 处理异常 } finally { db.endTransaction(); // 提交或回滚 }
场景 | 说明 |
---|---|
批量插入/更新 | 将多次数据库操作合并为一个事务,减少IO开销。 |
数据一致性要求 | 如用户注册时需同时插入用户表和积分表。 |
复杂业务逻辑 | 涉及多表关联操作时,保证原子性。 |
public void batchInsert(List<User> users) { SQLiteDatabase db = dbHelper.getWritableDatabase(); try { db.beginTransaction(); for (User user : users) { db.insert(UserTable.NAME, null, UserTable.toContentValues(user)); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } }
问题 | 原因 | 解决方案 |
---|---|---|
事务未提交 | 未调用 setTransactionSuccessful() | 确保在 try 块内调用。 |
数据库锁死 | 事务未结束导致资源未释放 | 在 finally 中调用 endTransaction() 。 |
部分操作失败 | 某条语句抛异常但未回滚 | 用 try-catch 包裹事务逻辑。 |
finally
中结束事务,防止资源泄漏。解答:
普通操作(如单条 insert
)每次执行后立即提交,而事务将多条操作视为一个整体,事务的优势在于:
解答:
Log.d()
输出关键步骤,观察事务是否进入回滚流程。示例:
try { db.beginTransaction(); db.insert(...); // 正常操作 db.insert(invalidData); // 触发异常 db.setTransactionSuccessful(); // 不会执行 } catch (Exception e) { // 异常被捕获,事务自动回滚 } finally { db.endTransaction(); } // 检查数据库,确认无新增数据