- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 H2 1.4 数据库,如果读取其他行,我可以写入新行吗?
即,如果表中有 1000 行,并且运行一个获取主键 1-10 的 SELECT 查询,INSERT 查询是否可以同时插入一些新行,或者是否必须等待 ( all) 该表上的 SELECT 查询要完成吗?
更新表中的行但没有被任何 SELECT 查询检索到是一种什么情况?
我问这个问题是因为在 H2 1.3 中,我注意到访问数据库的应用程序线程似乎花费了大量时间进行阻塞,现在我已经升级到 1.4 了,情况似乎更好了。但在我的多线程应用程序中,线程总是处理不同的行,因此对我来说,更好地理解锁定在 H2 中的工作原理(使用 MV 存储,之前在 1.3 中使用 PAGE 存储)以及 H2 是否可以锁定非常重要更新时或必须锁定整个表时的各个行。
最佳答案
这取决于您选择的存储引擎。以下所有信息适用于最新版本(1.4.199),旧版本有一些差异。
使用默认的MVStore引擎数据修改操作和SELECT … FOR UPDATE
锁定修改(或选择)的行。其他事务无法并行修改锁定的行,但可以读取它们的值。请注意,默认情况下使用已提交读隔离级别,该引擎并不真正支持其他隔离级别。使用读已提交隔离级别,其他事务将看不到并发修改的值,它们将看到旧的值。仅当该事务提交其工作时,新值才可见。使用此引擎,数据库默认以多线程模式运行,因此长时间运行的命令不会阻塞其他 session 。
使用旧版 PageStore 引擎(如果要使用此引擎创建数据库,请将 ;MV_STORE=FALSE
添加到连接 URL),整个表将被锁定以进行写入。这意味着您确实需要在所有事务中以相同的顺序(字母顺序或其他顺序)锁定表,否则可能会出现死锁。由于该引擎数据库默认运行在单线程模式下,您可以显式启用多线程模式,但使用该引擎并不安全。不同的 session 不能同时完成其工作,长时间运行的命令将阻止所有其他 session 。
当您使用新版本的H2打开数据库时,数据库不会从旧的(PageStore)格式转换为新的(MVStore)格式,您必须自己完成。另外旧数据库在新版本上可能会出现严重问题,建议使用SCRIPT TO 'filename.sql'
将它们导出到旧版本H2的SQL中。命令并使用 RUNSCRIPT FROM 'filename.sql'
将此脚本加载到具有新版本 H2 的新数据库中命令。即使您选择使用旧引擎,您也需要这样做。如果您有持久数据库,请不要忘记创建定期备份副本(例如,使用 BACKUP TO 'filename.zip'
命令)。
您可以在文档中找到更多详细信息:
https://h2database.com/html/advanced.html#mvcc
https://h2database.com/html/features.html#multiple_connections
关于sql - 使用H2 1.4数据库如果读取其他行我可以写入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56594138/
猫f1.txt阿曼维沙尔阿杰贾伊维杰拉胡尔曼尼什肖比特批评塔夫林现在输出应该符合上面给定的条件 最佳答案 您可以在文件读取循环中设置一个计数器并打印它, 计数=0 读取行时做 让我们数一数++ if
我正在尝试查找文件 1 和文件 2 中的共同行。如果公共(public)行存在,我想写入文件 2 中的行,否则打印文件 1 中的非公共(public)行。fin1 和 fin2 是这里的文件句柄。它读
我有这个 SQL 脚本: CREATE TABLE `table_1` ( `IDTable_1` int(11) NOT NULL, PRIMARY KEY (`IDTable_1`) );
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
如何从用户中选择user_id,SUB(row, row - 1),其中user_id=@userid我的表用户,id 为 1、3、4、10、11、23...(不是++) --id---------u
我曾尝试四处寻找解决此问题的最佳方法,但我找不到此类问题的任何先前示例。 我正在构建一个基于超本地化的互联网购物中心,该区域分为大约 3000 个区域。每个区域包含大约 300 个项目。它们是相似的项
preg_match('|phpVersion = (.*)\n|',$wampConfFileContents,$result); $phpVersion = str_replace('"','',
我正在尝试创建一个正则表达式,使用“搜索并替换全部”删除 200 个 txt 文件的第一行和最后 10 行 我尝试 (\s*^(\h*\S.*)){10} 删除包含的前 10 行空白,但效果不佳。 最
下面的代码从数据库中获取我需要的信息,但没有打印出所有信息。首先,我知道它从表中获取了所有正确的信息,因为我已经在 sql Developer 中尝试过查询。 public static void m
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图在两个表中插入记录,但出现异常。您能帮我解决这个问题吗? 首先我尝试了下面的代码。 await _testRepository.InsertAsync(test); await _xyzRepo
这个基本的 bootstrap CSS 显示 1 行 4 列: Text Text Text
如果我想从表中检索前 10 行,我将使用以下代码: SELECT * FROM Persons LIMIT 10 我想知道的是如何检索前 10 个结果之后的 10 个结果。 如果我在下面执行这段代码,
今天我开始使用 JexcelApi 并遇到了这个:当您尝试从特定位置获取元素时,不是像您通常期望的那样使用sheet.getCell(row,col),而是使用sheet.getCell(col,ro
我正在尝试在我的网站上开发一个用户个人资料系统,其中包含用户之前发布的 3 个帖子。我可以让它选择前 3 条记录,但它只会显示其中一条。我是不是因为凌晨 2 点就想编码而变得愚蠢? query($q)
我在互联网上寻找答案,但找不到任何答案。 (我可能问错了?)我有一个看起来像这样的表: 我一直在使用查询: SELECT title, date, SUM(money) FROM payments W
我有以下查询,我想从数据库中获取 100 个项目,但 host_id 多次出现在 urls 表中,我想每个 host_id 从该表中最多获取 10 个唯一行。 select * from urls j
我的数据库表中有超过 500 行具有特定日期。 查询特定日期的行。 select * from msgtable where cdate='18/07/2012' 这将返回 500 行。 如何逐行查询
我想使用 sed 从某一行开始打印 n 行、跳过 n 行、打印 n 行等,直到文本文件结束。例如在第 4 行声明,打印 5-9,跳过 10-14,打印 15-19 等 来自文件 1 2 3 4 5 6
我目前正在执行验证过程来检查用户的旧密码,但问题是我无法理解为什么我的查询返回零行,而预期它有 1 行。另一件事是,即使我不将密码文本转换为 md5,哈希密码仍然得到正确的答案,但我不知道为什么会发生
我是一名优秀的程序员,十分优秀!