sqllite的事务和锁的完美的解释。及在android中应用

本文探讨了在多线程环境下进行数据库操作时如何利用事务来保证数据的一致性和线程安全性。通过具体的代码示例介绍了批量插入数据时使用事务的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://www.cnblogs.com/senior-engineer/p/7112606.html?utm_source=itdadao&utm_medium=referral

 

 

制】多线程操作写入数据库时,需要使用事务,以免出现同步问题。

说明:

通过 SQLiteOpenHelper 获取数据库 SQLiteDatabase 实例,Helper 中会自动缓存

阿里巴巴 Android 开发手册

- 41 -

已经打开的 SQLiteDatabase 实例,单个 App 中应使用 SQLiteOpenHelper 的单例

模式确保数据库连接唯一。由于 SQLite 自身是数据库级锁,单个数据库操作是保证

线程安全的(不能同时写入) ,transaction 是一次原子操作,因此处于事务中的操作

是线程安全的。

若同时打开多个数据库连接,并通过多线程写入数据库,会导致数据库异常,提示

数据库已被锁住。

正例:

public void insertUserPhoto(SQLiteDatabase db, String userId, String content) {

ContentValues cv = new ContentValues();

cv.put("userId", userId);

cv.put("content", content);

db.beginTransaction();

try {

db.insert(TUserPhoto, null, cv);

// 其他操作

db.setTransactionSuccessful();

} catch (Exception e) {

// TODO

} finally {

db.endTransaction();

}

}

 

 

推荐】大数据写入数据库时,请使用事务或其他能够提高 I/O 效率的机制,保证执
行速度。
正例:
public void insertBulk(SQLiteDatabase db, ArrayList<UserInfo> users) {
db.beginTransaction();
try {
for (int i = 0; i < users.size; i++) {
ContentValues cv = new ContentValues();
cv.put("userId", users[i].userId);
cv.put("content", users[i].content);
db.insert(TUserPhoto, null, cv);
}
// 其他操作
db.setTransactionSuccessful();
} catch (Exception e) {
// TODO
} finally {
db.endTransaction();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值