多进程操作数据库异常问题

问题场景:

消息中心批量删除历史数据,偶现删不掉的情况。
消息中心的数据存储在数据库中,在删除数据时,由于是批量操作,可能这时候有新消息过来,就会插入新数据,这样就出现多线程操作数据库的情况。在插入,删除数据库的位置加锁之后,还是有问题。
后面发现由于推送模块是在独立的进程里面,多进程操作数据库,所以这里加锁就没啥用了。

解决办法:

1.使用文件锁

   public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {try {final File lockFile = new File(Objects.requireNonNull(getContext()).getExternalCacheDir(), "lock.txt");if(!lockFile.exists()) {lockFile.mkdirs();}RandomAccessFile raf = new RandomAccessFile(lockFile, "rw");FileChannel channel = raf.getChannel();FileLock fileLock = channel.tryLock();if (fileLock != null) {return super.applyBatch(operations);}} catch (Exception e) {}return null;}

2.android中的sqlite数据库是支持事务处理的,这里也可以使用事务来保证批处理数据库的原子性

    public ContentProviderResult[] applyBatch(@NonNull ArrayList<ContentProviderOperation> operations) throws OperationApplicationException {SQLiteDatabase db = mDBHelper.getWritableDatabase();ContentProviderResult[] result;db.beginTransaction();try {result = super.applyBatch(operations);db.setTransactionSuccessful();} finally {db.endTransaction();}return result;}
总结:

ContentProvider的applyBatch方法并不能保证原子性,可以重写applyBatch方法加上事务逻辑来保证数据库批处理的原子性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HCIE】04.网络安全技术

端口隔离 在同一VLAN中可以隔离二层与三层通信&#xff0c;让同VLAN内的设备可以通信或者不可以通信。 定义一个端口隔离组&#xff0c;在一个组内无法互访&#xff0c;不在一个组里面可以进行互访 port-isolate enable group1 //使能端口隔离功能 port-isolate mdoe all //全…

B : DS顺序表--连续操作

Description 建立顺序表的类&#xff0c;属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09; 该类具有以下成员函数&#xff1a; 构造函数&#xff1a;实现顺序表的初始化。 插入多个数据的multiinsert(int i, int n, int item[])函数&#…

Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

Unity 开发人员的城堡游戏引擎概述 一、简介2. Unity相当于什么GameObject&#xff1f;3. 如何设计一个由多种资产、生物等组成的关卡&#xff1f;4. 在哪里放置特定角色的代码&#xff08;例如生物、物品&#xff09;&#xff1f;Unity 中“向 GameObject 添加 MonoBehaviour”…

qml ProgressBar用法介绍

ProgressBar 是 QML 中的一个组件,用于显示一个任务的完成进度。它是 Qt Quick Controls 2 模块中的一个组件,使用时需要包含import QtQuick.Controls. ProgressBar常用于显示文件上传、下载、计算或其他长时间任务的进度。 下面是 ProgressBar 的一些基本用法: 1. 基本使…

GAN初识

1. 生成对抗网络GAN简介 1.1 生成器 G(Z)接受随机噪声Z作为输入生成仿品&#xff0c;并训练自己去欺骗判别器D&#xff0c;让D以为G(Z)产生的任何数据都是真实的。 1.2 判别器 D(Y)可以基于真品和仿品来判断仿造品的仿真程度&#xff0c;通常值越靠近0表示越真实(靠近1表示仿造…

Vue3大屏项目实现数字跳动的效果

一、vue-count-to组件&#xff1a; 1、安装&#xff1a; npm install vue3-count-to --save 2、使用&#xff1a; <template><BaseCountTo:startVal"startVal":endVal"endVal":duration"duration":decimals"decimals":pr…

基于复旦微的FMQL45T900全国产化ARM核心模块(100%国产化)

TES745D是一款基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;能…

Redis 五大类型源码及底层实现

面试题&#xff1a; 谈谈Redis数据类型的底层数据结构&#xff1a; SDS动态字符串双向链表玉缩列表ziplist哈希表hashtable跳表kiplist整数集合intset快速列表quicklist紧凑列表listpack Redis源代码的核心部分 官网&#xff1a;GitHub - redis/redis: Redis is an in-memory…

在已知的二维坐标里找到最接近的点

一、业务场景 最近在研发的项目&#xff0c;在做可视化层&#xff0c;在全球地图上&#xff0c;对我们的国家的陆地地图经纬度按照步长为1的间隔做了二维处理。在得到一组整数的点位信息后&#xff0c;需要将我们已有的数据库数据(业务项目)按照地址的经纬度&#xff0c;映射到…

大数据Flink(八十三):SQL语法的DML:With、SELECT WHERE、SELECT DISTINCT 子句

文章目录 SQL语法的DML:With、SELECT & WHERE、SELECT DISTINCT 子句 一、DML:With 子句

本地Docker Registry远程连接,为你带来高效便捷的镜像管理体验!

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

jmeterbeanshell调用jsonpath获取对应值

1.jmeter 新建线程组、Java Request、BeanShell Assertion、View Results Tree 2、在BeanShell Assertion中贴入代码&#xff1a; import org.apache.jmeter.extractor.json.jsonpath.JSONManager; import java.util.List; JSONManager js new JSONManager(); String jsonStr…

电商项目高级篇-01 elasticsearch

电商项目高级篇-01 elasticsearch 1、linux下安装elasticsearch和可视化工具2、docker设置虚拟机开机启动和容器开机启动3、elasticsearch的curd3.1、新增、更新3.2、查询 1、linux下安装elasticsearch和可视化工具 将安装好jdk1.8和tomcat的centos7下安装elasticsearch dock…

js实现短信验证码一键登录

前言 短信验证码一键登录是一种方便快捷的登录方式&#xff0c;用户只需输入手机号码&#xff0c;然后接收到手机短信验证码并自动填入验证码框&#xff0c;即可完成登录操作。本文将介绍短信验证码一键登录的原理&#xff0c;并给出一个简单的示例说明。 短信验证码一键登录…

贝叶斯神经网络 BBB 学习中遇到的一些问题

这里写目录标题 贝叶斯公式模型概率的公式1/n 形式的贝叶斯公式 全概率公式全概率公式的积分形式 后验推理后验预测分布 posterior predictive distributionKL 散度 平均场 VIBayes by Backprop 代码重新参数化 贝叶斯公式 模型概率的公式 一开始看了这个 https://zhuanlan.z…

Unity 2021.x及以下全版本Crack

前言 最近Unity那档子事不出来了吗&#xff0c;搞得所有人都挺烦的&#xff0c;顺便在公司内网需要我完成一个游戏的项目&#xff0c;就研究了一下如何将Unity给Crack掉。 注意所有操作应有连接外网的权限 以我选择的版本为例&#xff0c;我使用的是Unity 2021.3.5f1与Unity…

企业商标信息API:品牌管理的秘密武器

引言 当今数字时代&#xff0c;品牌管理变得比以往任何时候都更具挑战性。企业需要不断创新、保护知识产权、实时监测市场动态以及应对竞争压力。在这个竞争激烈的环境中&#xff0c;企业商标信息API已经成为品牌管理的秘密武器&#xff0c;为企业提供了无可估量的价值。 企业…

CFCA企业版通配符SSL证书

CFCA是中国CFCA企业版通配符SSL证书金融认证中心的缩写&#xff0c;即China Financial Certification Authority。它是一家经过中国人民银行和国家信息安全机构批准成立的国家级权威安全认证机构&#xff0c;也是国际CA浏览器联盟组织&#xff08;CA/Browser Forum&#xff09;…

基础算法--位运算

位运算理解&#xff1a; n >> k&#xff1a;代表n右移k位 比如 000011 >> 1 000001 前面会补零&#xff08;所以第几位是从0开始计算&#xff09; n & 1&#xff1a;表示最后一位是否为1 比如&#xff1a;n 3 0011 而 1 0001 则3 & 1 0011 & 000…

红日靶场五(vulnstack5)渗透分析

环境搭建 win7 192.168.111.132&#xff08;仅主机&#xff09; 192.168.123.212&#xff08;桥接&#xff09; .\heart p-0p-0p-0win2008 ip: 192.168.111.131&#xff08;仅主机&#xff09; sun\admin 2020.comkali ip: 192.168.10.131&#xff08;nat&#xff09;vps&…