问题标签 [database-locking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android:数据库已锁定,尽管我已将其关闭
我有一个创建和运行任务的活动,在这个任务中创建了一个数据库连接。然后我启动一个事务并对数据库进行一些操作。我希望当方向更改出现时,任务在更改后被取消并重新启动
因此,我在 onSaveInstanceState 方法的任务中调用此方法:
但是当我在 onRestoreInstanceState 中的任务中重新启动任务时,表示数据库已锁定。我还注意到数据库连接似乎永远不会在事务中。
谁能告诉我如何解决这个问题。
android - Android:SQLiteOpenHelper.getDatabaseLocked
我无法弄清楚是什么锁定了我的数据库。这个应用程序在生产中是全新的,我什至无法执行第一个操作,即向数据库添加用户。我有一个 DatabaseHandler 可以完成所有数据库操作。我的 Activity 正在调用该处理程序中的方法。该方法打开和关闭数据库。目前,唯一面向数据库的其他操作是创建数据库。
数据库处理程序.java
我已插入 Log.d 以查看挂断的位置。它调用 getWritableDatabase 的那一刻,应用程序崩溃。
ActivityUserAccountCreate.java
我已经删除了无聊的无关代码。我已经包括了上下文和类。我想知道上下文是否是问题所在?否则我在我的其他数据库应用程序中使用这个确切的代码并且没有问题。我想不出这里有什么不同。
multithreading - QSQLite 错误:数据库被锁定
我是 Qt 开发的新手,它处理线程(信号和插槽)和数据库(以及 SQLite)的方式。我已经开始研究上述技术已经 4 周了。这是我第一次在 SO 上发布问题,我觉得在来找大家之前我已经做了研究。这可能看起来有点长,可能是重复的,但我要求大家在将其作为重复或 tl;dr. 解雇之前通读一遍。
上下文:
我正在开发一个在数据库上执行特定操作 X 的 Windows 应用程序。该应用程序是在 Qt 中开发的,并使用 QSQLite 作为数据库引擎。它是一个单线程应用程序,即按顺序处理表。但是,随着数据库大小的增长(表和记录的数量),此处理变得更慢。此操作 X 的结果被写入同一 DB 中的单独结果表中。正在完成的处理对问题无关紧要,但基本而言,它的作用如下:
从 Table_X_1 中读取一行 从 Table_X_2 中读取一行
对行进行一些操作(仅读取)
将结果推送到 Table_X_Results 表中(这是对 DB 执行的唯一写入)
Table_X_1 和 Table_X_2 的列数和类型以及行数相同,只是数据可能不同。
我正在尝试做的事情:
为了提高性能,我正在尝试使应用程序多线程。最初我产生了两个线程(使用 QtConcurrentRun)。这两个表可以分为两种类型,例如 A 和 B。每个线程将处理两种类型的表。线程内的处理保持不变,即,在每个线程内,表是按顺序处理的。
该函数是这样的,它使用 SELECT 来获取行进行处理,并使用 INSERT 将结果插入结果表中。为了插入我正在使用事务的结果。
在开始实际操作之前,我正在创建所有中间表、结果表和索引。我每次都在打开和关闭连接。对于线程,我在进入循环之前创建并打开一个连接(每个线程一个)。
问题:
在我的处理函数中,我得到以下(讨厌的、臭名昭著的、顽固的)错误:
QSqlError(5, "无法获取行", "数据库被锁定")
当我尝试从 DB 中读取一行时(使用 SELECT),我收到了这个错误。这与我在结果表中执行 INSERT 的功能相同。SELECT 和 INSERT 在同一个事务中(开始和提交对)。对于 INSERT,我使用的是准备好的语句 (SQLiteStatement)。
我正在做的看似奇怪的事情的原因:
- 我正在使用 QtConcurrentRun 创建线程,因为它很简单!我尝试过使用 QThread(不是子类 QThread,而是另一种方法)。这也会导致同样的问题。
- 我正在使用 DSQLITE_THREADSAFE=0 进行编译以避免应用程序崩溃。如果我使用默认值 (DSQLITE_THREADSAFE=1),我的应用程序会在 SQLiteStatement::recordSet->Reset() 处崩溃。此外,使用默认选项,内部 SQLITE 同步机制开始发挥作用,这可能不可靠。如果需要,我将使用显式同步。
- 使应用程序多线程以提高性能,而不是这样做。我正在处理那里推荐的所有优化。
- 使用 QSqlDatabase::setConnectOptions 和 QSQLITE_BUSY_TIMEOUT=0。一个链接表明它将防止数据库立即被锁定,因此可能会给我的线程适当的时间来“和平地死去”。这失败了:数据库比以前更频繁地被锁定。
观察:
- 数据库仅在其中一个线程返回时才进入锁定状态。这种行为是一致的。
- 当使用 DSQLITE_THREADSAFE=1 进行编译时,应用程序会在其中一个线程返回时崩溃。在我的函数中的 SQLiteStatement::recordSet->Reset() 和 sqlite3.c 中的 winMutexEnter()(从 EnterCriticalSection() 调用)调用堆栈点。这也是一致的。
- 使用 QtConcurrentRun 创建的线程不会立即死亡。
- 如果我使用 QThreads,我无法让它们返回。也就是说,即使我正确连接了信号和插槽,我也感觉线程永远不会返回。等待线程的正确方法是什么,它们需要多长时间才能死掉?
- 完成执行的线程永远不会返回,它已锁定数据库并因此锁定错误。
- 我检查了 SQLITE_BUSY 并试图让线程休眠但无法让它工作。在 Qt 中睡眠的正确方法是什么(对于使用 QtConcurrentRun 或 QThreads 创建的线程)?
当我关闭连接时,我收到以下警告:
QSqlDatabasePrivate::removeDatabase: 连接 'DB_CONN_CREATE_RESULTS' 仍在使用中,所有查询都将停止工作。
这有什么意义吗?一些链接表明此警告是由于使用本地 QSqlDatabase 而出现的,如果连接是类成员则不会出现。但是,这可能是我的问题的原因吗?
进一步的实验:
- 我正在考虑创建另一个仅包含结果表(Table_X_Results)的数据库。基本原理是,虽然线程将从一个数据库(我目前拥有的数据库)读取,但它们将写入另一个数据库。但是,我可能仍然面临同样的问题。此外,我在论坛和维基上读到,可以有两个线程在同一个数据库上进行读写。那么为什么我不能让这个场景起作用呢?
- 我目前正在使用 SQLITE 版本 3.6.17。这可能是问题吗?如果我使用 3.8.5 版本会更好吗?
我试图发布我已经探索过的网络资源,但我收到一条消息说“我需要 10 个代表才能发布超过 2 个链接”。任何帮助/建议将不胜感激。
database - Delphi:数据库被锁定(SQLite)
我面临两个问题...
(1) 当我尝试使用 Delphi XE6 写入数据库 (SQLite) 时,我总是得到数据库被锁定的错误消息。我确定每次使用命令 FDConnection1.Close 访问数据库时都会关闭数据库;
(2) 如何将传入参数插入到表中?我有以下传入参数
并尝试使用以下 SQL 命令写入表:
但它似乎不起作用......
以下是我遇到问题的完整程序
任何提示将不胜感激。提前致谢。
django - 重写表的部分时如何实现数据库一致性?
我有一个简单的数据库关系:一个 Item 与许多 ItemDetails 相关。ItemDetails 会立即更新:一条消息通过 HTTP POST 传入,其中包含完整的 ItemDetails 集,以替换任何旧的 ItemDetails。我使用的逻辑是这样的:
但是,如果两个发件人同时发送更新,这似乎有一个竞争条件。我有时会看到重复的列表,因为(我认为)delete() 在或多或少并行的两个线程上运行,然后创建发生。
我可以使用什么锁定策略来避免这个问题?我正在将 Django 与 PostgreSQL 一起使用。
java - 如何从所有其他客户端锁定 MongoDB 集合(写入或读取)?
(侧栏上其他标题相似的问题没有解决这个问题。)
我有一个像历史序列生成器一样使用的集合:
我希望能够:
- 从所有其他客户端锁定集合(写入或读取)
- 将最近的 seq_id 读入内存
- 在内存中生成另外 3 个序列 ID(在我的例子中是 Java)
- 将 3 个文档插入集合中
- 解锁收藏
我希望能够在我的客户端锁定集合时锁定所有其他客户端甚至无法读取集合,因为在我的客户端到达第 4 步之前到达第 2 步和第 3 步的另一个客户端会导致 seq_ids 冲突。
database - 表 oracle 锁定
我不是 dba,但我遇到了一个数据库问题,它锁定了表并因此造成了很大的混乱。我从 oracle dba 获得了一些信息,如果有人可以帮助我找到问题的关键或指出我需要做什么,我将更多信息放在这里:
我有一份来自 oracle 的大报告,但我不理解 95% 的数据。
mysql - 如何实现基于数据库锁定的重复保护
在使用 InnoDB 存储引擎的 Web 应用程序中,我无法在以下场景中充分利用数据库锁定。
有 3 张桌子,我会称它们aa
为ar
和ai
。
aa
保存基本记录,比方说文章。ar
保存与每条记录相关的信息以及和之间aa
的关系。aa
ar
1:m
第一次读取来自的记录ar
时,会存储记录。问题在于,当两个请求以(几乎)相同的方式启动以从中读取记录(其相关记录尚未存储在 中)时,记录会重复。aa
aa
ar
ar
下面是一个伪代码来帮助理解这种情况:
读取请求的
aa
记录。扫描
ar
表以查明给定aa
记录是否已存储任何内容。(假设它没有。)咨询
ai
以找出ar
给定aa
记录要存储的内容。(ai
似乎有些无关紧要,但我发现它也必须参与锁定......可能是错误的。)插入几行到
ar
这是我想要实现的目标:
- 读取请求的
aa
记录。
无论是否使用事务,锁定ar
,因此任何后续尝试读取的请求都将在此时ar
等待,直到完成。
扫描
ar
表以查明给定aa
记录是否已存储任何内容。(假设它没有。)问题是在两个同时请求的情况下,两者都发现给定记录中没有记录,并且它们都继续插入相同的行两次。ar
aa
否则,如果有,则中断此序列并且不发生 INSERT。咨询
ai
以找出ar
给定aa
记录要存储的内容。(ai
似乎有些无关紧要,但我发现它也必须参与锁定......可能是错误的。)插入几行到
ar
解除锁定ar
看起来很简单,我没有成功避免重复。我正在测试来自 Bash shell 中一个简单命令的同时请求(使用 wget)。
我花了一段时间在http://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html和这里http://dev.mysql 了解 InnoDB 引擎的锁定是如何工作的。 com/doc/refman/5.5/en/innodb-locking-reads.html并尝试了几种利用锁的方法,仍然没有运气。
我希望锁定整个ar
表(因为我想防止 INSERT 发生多个请求)导致进一步尝试与该表交互以等待第一个锁被释放。但是文档中只提到了“整个表”被锁定(第一个链接页面中的意向锁部分),但没有进一步讨论,或者我无法弄清楚如何实现它。
谁能指出正确的方向?
java - SQLite - 数据库被锁定在 Java 中
在第一种方法中,我创建数据库(如果不存在):
在第二种方法中,以其他方式(我做同样的事情,更改更新查询),我尝试读取表中是否插入了某些行,如果现在创建了表,则插入它:
在另一个调用中,在项目之后,我尝试只更新一行(ID = 1),并且**在这一行中,给了我错误**:
'
**错误代码 : **
我需要这方面的帮助。谢谢。(我不使用提交,我尝试使用它并且也给了我错误)
python - 防止数据库锁定在 django 和 django-rest-framework 中的多个 ajax 帖子
我有以下型号
我正在创建一个 javascript 客户端来创建新的 Peri 和任务。在创建新的 Peri 模型以预先创建必要的任务时,我想对自己轻松一点。每个 Peri 最多有 64 个任务。所以我想预先创建它们,然后让用户从 javascript 客户端/前端编辑它们。创建是使用 ajax 和 django-rest-framework 完成的。我使用 ajax 调用来创建 peri 模型,如果成功,我将创建任务
问题是我收到锁定数据库的错误。我在开发阶段使用 sqlit,但我不确定这不会在更大的生产规模中发生。我怎样才能通过这个问题?