首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

knexjs为什么mysql不能在插入后立即返回正确的selects记录

knexjs是一个流行的Node.js的SQL查询构建器,它可以用于与各种关系型数据库进行交互,包括MySQL。在使用knexjs进行MySQL插入操作后,立即执行select查询可能无法返回正确的记录,这是由于MySQL的特性导致的。

MySQL是一个事务性数据库管理系统,它使用了ACID(原子性、一致性、隔离性和持久性)的事务模型来确保数据的完整性和一致性。在默认情况下,MySQL使用的是可重复读(REPEATABLE READ)的隔离级别。

在可重复读隔离级别下,MySQL会在事务开始时创建一个一致性视图,该视图会在整个事务期间保持不变。当进行插入操作时,MySQL会将新插入的记录放入事务的工作区(undo log),而不是立即将其写入磁盘。这是为了保证事务的原子性和一致性。

因此,当使用knexjs进行MySQL插入操作后立即执行select查询时,由于新插入的记录尚未写入磁盘,查询可能无法返回正确的记录。需要等待事务提交或者使用其他机制来确保插入操作已经完成。

解决这个问题的一种方法是使用MySQL的自动提交模式(autocommit),将插入操作和select查询分别放在不同的事务中。这样,在插入操作提交后,select查询就能够返回正确的记录。

另一种方法是使用knexjs提供的事务支持,将插入操作和select查询放在同一个事务中,并在插入操作完成后再执行select查询。这样可以确保插入操作已经完成,从而返回正确的记录。

总结起来,knexjs执行MySQL插入操作后立即返回正确的selects记录可能会受到MySQL的事务隔离级别和数据写入机制的影响。为了确保插入操作完成后能够返回正确的记录,可以使用MySQL的自动提交模式或者knexjs的事务支持来处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 一条SQL语句在MySQL中如何执行

    所以,一般在大多数情况下我们都是推荐去使用查询缓存MySQL 8.0 版本删除了缓存功能,官方也是认为该功能在实际应用场景比较少,所以干脆直接删掉了。...做完这些操作,就会进入第二步。 第二步,语法分析,主要就是判断你输入 sql 是否正确,是否符合 MySQL 语法。...5) 执行器 当选择了执行方案MySQL 就准备开始执行了,首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息,如果有权限,就会去调用引擎接口,返回接口执行结果。...那么确认了执行计划就准备开始执行了。 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎执行结果。...这个就要依赖于 MySQL 处理机制了,MySQL 处理过程如下: •判断 redo log 是否完整,如果判断是完整,就立即提交。

    3.5K20

    MySQL 教程下

    关于这个内容稍后还要做进一步介绍)。 重要是知道视图仅仅是用来查看存储在别处数据一种设施。视图本身包含数据,因此它们返回数据是从其他表中检索出来。...但是,并非所有视图都是可更新。基本上可以说,如果 MySQL 不能正确地确定被更新基数据,则不允许更新(包括插入和删除)。..., 因为另一事务插入了一条记录 四大隔离级别: 读未提交数据: 读已提交数据: 防止了脏读, 没有处理不可重复读 和 幻读 (oracle 采用) 可重复读: 防止了脏读和不可重复读, 处理不了幻读...换句话说,任何时候你执行一条 MySQL 语句,该语句实际上都是针对表执行,而且所做更改立即生效。...❑ 有的操作(包括 INSERT)支持一个可选 DELAYED 关键字,如果使用它,将把控制立即返回给调用程序,并且一旦有可能就实际执行该操作。 ❑ 在导入数据时,应该关闭自动提交。

    1K10

    一张图看懂 SQL 执行过程

    这些 SQL 语句首先被送到分析器,分析器任务是解析 SQL 语句,确定其语法是否正确,并将其转化为一个内部数据结构,以供 MySQL 后续使用。...如果是唯一索引,由于需要保证更新唯一性,所以需要立即把数据页从磁盘加载到内存,然后更新数据页;如果是非唯一索引,则将数据更新操作记录到 change buffer,它将在在空闲时异步更新到磁盘。...而 insert buffer 开启,会先判断聚集索引页是否存在于缓冲池中,如果有,直接插入;如果不在,先放入一个插入缓冲区进行排序,再以一定频率合并(merge)更新索引页。...由于唯一索引需要立即 IO 到磁盘,以保证数据冲突,因此唯一索引没有 change buffer 机制。 8....redo log 用于记录 InnoDB 引擎下事务日志,支持崩溃数据自修复。 如果只写 binlog,而写 redo log,当 MySQL 发生故障宕机时,就可能会丢失最近执行事务数据。

    54830

    MySQL中都有哪些锁?

    MySQL 8 版本,自增值增加了持久化能力,记录在undo_log里面,重启,靠undo_log进行恢复,也就不会出现之前问题了。 自增值会不会出现连续现象?...自增锁它是一种特殊表锁。在对计数器进行+1操作前加上,这样就保证了并发自增安全性,不会出现重复现象。为了提供插入性能,自增锁并不会等到事务结束才会释放,而是在插入完成之后就立即释放了。...能够保证锁定这个间隙之后,其他事务不能在这个间隙里插入任何行记录。 图片 如上示意图中,在id = 5和id = 10两行记录之间,存在区间(5, 10),间隙锁正是锁住这个区间。...因为我们要理解间隙锁目的:锁定某个区间,其他事务不能在这个区间插入任何行记录,避免幻读。因此不管你在这个区间加多少个间隙锁,其本质目的是一样,所以不会出现冲突。...show open tables where in_use > 0; 如果上面语句执行有返回记录,例如返回如下信息,就说明user表正在使用,很有可能出现了锁表情况。

    91551

    手把手教你分析Mysql死锁问题

    假设有索引值4、7,几个不同事务准备插入5、6,每个锁都在获得插入独占锁之前用插入意向锁各自锁住了4、7之间间隙,但是阻塞对方因为插入冲突。...它又想拿什么样插入意向排他锁呢? 事务B拿了具体什么间隙锁呢?它为什么也要拿插入意向锁? 死锁死循环是怎么形成?目前日志看不出死循环构成呢?...剥夺条件:指进程已获得资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。...它为什么也要拿插入意向锁?...~) 事务A,B形成了死锁闭环,因为Innodb底层机制,它会让其中一个事务让出资源,另外事务执行成功,这就是为什么你最后看到事务B插入成功了,但是事务A插入显示了Deadlock found

    45531

    一篇文章彻底搞懂Mysql事务相关原理

    MySQL评估WHERE条件,将释放匹配行记录锁。...回滚段中撤消日志分为插入和更新撤消日志。插入撤消日志仅在事务回滚时才需要,并且在事务提交可以立即将其丢弃。...与聚簇索引记录不同,辅助索引记录包含隐藏系统列,也不会就地更新。 更新二级索引列时,将对旧二级索引记录进行删除标记,插入记录,并最终清除带有删除标记记录。...在聚集索引中,DB_TRX_ID检查记录记录,如果在启动读取事务修改了记录,则从撤消日志中检索记录正确版本。 如果二级索引记录被标记为删除或二级索引页被更新事务更新, 则不使用覆盖索引技术。...进行一系列相关更改立即提交事务,以减少冲突发生。特别是,不要长时间关闭未提交事务交互式 mysql会话。 如果您使用锁定读取(SELECT ... FOR UPDATE或 SELECT ...

    81910

    MySQL这些题目你都会吗?

    2、INSERT BUFFER即合并插入缓存,从innodb 1.0.x版本开始引入CHANGE BUFFER,下面关于insert buffer说法正确是( ) A.合并插入只适用非唯一辅助索引。...B.脏读是某一事务读取了另外一个事务未提交数据,不可重复读是读取了其他事务提交数据,脏读和不可重复读都可以通过事物隔离级别控制。 C.RR隔离级别,只能返回比当前事务早提交插入、更新、删除值。...B.RC是每条SQL创建读视图,在每个SQL语句开始执行时候创建,隔离作用域仅限该条SQL语句。 C.Read uncommitted是创建读视图,直接返回记录最新值。...事物提交时,不会立即删除undo log,RR隔离级别下,事物读取都是开启事物时最新提交行版本,只要该事物结束,该版本就不能删除。...6、关于MySQL Innodb 行记录隐藏字段说法正确是( ) A.每行记录都有三个隐藏字段:事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_PTR)、隐藏ID(DB_ROW_ID)。

    1K42

    MYSQL 必考面试题10道(答案解释)

    2 INSERT BUFFER即合并插入缓存,从innodb 1.0.x版本开始引入CHANGE BUFFER,下面关于insert buffer说法正确是() A.合并插入只适用非唯一辅助索引。...B.脏读是某一事务读取了另外一个事务未提交数据,不可重复读是读取了其他事务提交数据,脏读和不可重复读都可以通过事物隔离级别控制。 C.RR隔离级别,只能返回比当前事务早提交插入、更新、删除值。...B.RC是每条SQL创建读视图,在每个SQL语句开始执行时候创建,隔离作用域仅限该条SQL语句。 C.Read uncommitted是创建读视图,直接返回记录最新值。...事物提交时,不会立即删除undo log,RR隔离级别下,事物读取都是开启事物时最新提交行版本,只要该事物结束,该版本就不能删除。...6 关于MySQL Innodb 行记录隐藏字段说法正确是() A.每行记录都有三个隐藏字段:事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_PTR)、隐藏ID(DB_ROW_ID)。

    3.4K41

    Mysql参数innodb_thread_concurrency

    当InnoDB从用户会话收到一个新请求,如果线程并发执行数量达到预定义限制,那么新请求会先睡眠一段时间再次尝试。在睡眠不能按计划执行请求会被放入先入/先出队列,并最终处理。...正在等待获取锁线程,一旦锁可用,会被立即分配一个“tickets”。 这些参数正确值取决于当前系统环境和负载情况。尝试各种不同值,以确定哪些值适用于当前应用程序。...老鸨(MySQL)不可能允许那么多人同时进屋去,就限制每次只能进去几个,这个限制名字就叫(innodb_thread_concurrency) 其他的人怎么办,只能在外面排成长队依次进入。...4 笔记 tickets可以理解为MySQL层和Innodb层交互次数,比如一个select一条数据就是需要Innodb层返回一条数据然后MySQL层进行where条件过滤然后返回给客户端,抛开where...这样我们也就理解为什么innodb_concurrency_tickets可以避免(长时间处理线程)长时间堵塞(短时间处理线程)原因了。

    1.7K11

    手把手教你分析Mysql死锁问题

    假设有索引值4、7,几个不同事务准备插入5、6,每个锁都在获得插入独占锁之前用插入意向锁各自锁住了4、7之间间隙,但是阻塞对方因为插入冲突。...它又想拿什么样插入意向排他锁呢? 事务B拿了具体什么间隙锁呢?它为什么也要拿插入意向锁? 死锁死循环是怎么形成?目前日志看不出死循环构成呢?...剥夺条件:指进程已获得资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。...它为什么也要拿插入意向锁?...~) 事务A,B形成了死锁闭环,因为Innodb底层机制,它会让其中一个事务让出资源,另外事务执行成功,这就是为什么你最后看到事务B插入成功了,但是事务A插入显示了Deadlock found

    66822

    MYSQL 必考面试题10道(多选)

    2 INSERT BUFFER即合并插入缓存,从innodb 1.0.x版本开始引入CHANGE BUFFER,下面关于insert buffer说法正确是() A.合并插入只适用非唯一辅助索引。...B.脏读是某一事务读取了另外一个事务未提交数据,不可重复读是读取了其他事务提交数据,脏读和不可重复读都可以通过事物隔离级别控制。 C.RR隔离级别,只能返回比当前事务早提交插入、更新、删除值。...B.RC是每条SQL创建读视图,在每个SQL语句开始执行时候创建,隔离作用域仅限该条SQL语句。 C.Read uncommitted是创建读视图,直接返回记录最新值。...6 关于MySQL Innodb 行记录隐藏字段说法正确是() A.每行记录都有三个隐藏字段:事务ID(DB_TRX_ID)、回滚指针(DB_ROLL_PTR)、隐藏ID(DB_ROW_ID)。...8 MySQL二进制日志binlog可以说是MySQL最重要日志,关于binlog说法正确是() A.当指定了binlog大小,如果有大事物,一个binlog放不下,会放到下一个binlog中,而不会导致

    1.4K31

    【SQL】Mysql中一条sql语句执行过程

    3、解析SQL语句 在经过缓存,就由「解析器」开始工作了,解析器目的是检查sql语句是否正确以及将sql语句解析成MySQL能够理解结构,也就是sql语法树。...5、执行SQL语句 经过「优化器」最终生成一个最优执行计划交给「执行器」来执行,执行器通过调用「存储引擎」接口来获取数据。 这里先展开执行器与存储引擎交互,后面的文章会详细阐述一下。...SQL接口接收到SQL查询语句会先去缓存查询,如果命中返回给客户端,否则交给解析器。 解析器在拿到SQL语句后会判断语法是否正确正确会生成sql语法树交给优化器,否则报错给客户端。...那么确认了执行计划就准备开始执行了。 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎执行结果。...这个就要依赖于 MySQL 处理机制了,MySQL 处理过程如下: 判断 redo log 是否完整,如果判断是完整,就立即提交。

    47210

    MySQL 执行语句分析

    : 先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 sql 语句为 key 在内存中查询是否有结果,如果有直接缓存,则返回;如果没有...进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎执行结果。...这是因为最开始 MySQL 并没有 InnoDB 引擎( InnoDB 引擎是其他公司以插件形式插入 MySQL ) ,MySQL 自带引擎是 MyISAM,但是我们知道 redo log 是 InnoDB...,然后再提交 redo log 就会防止出现上述问题,从而保证了数据一致性。...这个就要依赖于 MySQL 处理机制了,MySQL 处理过程如下: 判断 redo log 是否完整,如果判断是完整,就立即提交 如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断

    2.5K10

    MySQL实战第十四讲-count(*)这么慢,我该怎么办?

    假设表 t 中现在有 10000 条记录,我们设计了三个用户并行会话。 1. 会话 A 先启动事务并查询一次表总行数; 2. 会话 B 启动事务,插入一行后记录,查询表总行数; 3. ...会话 C 先启动一个单独语句,插入一行记录,查询表总行数。 我们假设从上到下是按照时间顺序执行,同一行语句是在同一时刻执行。...和第 8 篇文章《MySQL深入学习第八篇 - 事务到底是隔离还是隔离?》中相关内容。 当然,现在这个看上去笨笨 MySQL,在执行 count(*) 操作时候还是做了优化。...你可能还记得在第 10 篇文章《MySQL深入学习第十篇-MySQL为什么有时候会选错索引?》中我提到过,索引统计值是通过采样来估算。...如果把 update 计数表放到事务第一个语句,多个业务表同时插入数据的话,等待时间会更长。 这个答案结论是对,但是理解不太正确

    1.6K10

    SQL注入几种类型和原理

    为什么使用concat函数中第一个参数构造了一个波浪号?其实这个原因和上面一样,构造非法参数,这样才能在错误中看到后面完整数据。 ?...通过构造语句,来判断数据库信息正确性,通过页面返回 ”真“ 和 ”假“ 来识别判断是否正确。...无法进行报错注入和布尔注入之后,人们想到了新攻击点,“页面返回时间”,笔者觉得能想到这一点人真是天才,谁提出已无法追溯,可能在过去一段时间内,对于一些无论正确还是错误页面返回都相同,攻击者在很长一段时间陷入困境...ceye.io”知道创宇404团队开发一款记录DNSlog平台,不仅能记录DNS请求,HTTP请求也同样。(就是日常崩)。 为什么这里有四个“\”,因为转义原因, ?...(可声明编码),更换编码正确显示。

    5.4K52

    史上最全大厂Mysql面试题在这里

    记录出错信息,也记录一些警告信息或者正确信息。...查询日志:记录所有对数据库请求信息,不论这些请求是否得到了正确执行。 慢查询日志:设置一个阈值,将运行时间超过该值所有SQL语句都记录到慢查询日志文件中。...缺点:由于记录只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行时候 一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 结果。...而且不会出现某些特定情况下存储过程,或function,以及trigger调用和触发无法被正确复制问题 缺点:所有的执行语句当记录到日志中时候,都将以每行记录修改来记录,这样可能会产生大量日志内容...为什么是这样子

    1.1K90

    MySQL深入学习第十四篇-count(*)这么慢,我该怎么办?

    假设表 t 中现在有 10000 条记录,我们设计了三个用户并行会话。 1. 会话 A 先启动事务并查询一次表总行数; 2. 会话 B 启动事务,插入一行后记录,查询表总行数; 3....会话 C 先启动一个单独语句,插入一行记录,查询表总行数。 我们假设从上到下是按照时间顺序执行,同一行语句是在同一时刻执行。 如下 图1 所示为会话 A、B、C 执行流程: ?...和第 8 篇文章《MySQL深入学习第八篇 - 事务到底是隔离还是隔离?》中相关内容。 当然,现在这个看上去笨笨 MySQL,在执行 count(*) 操作时候还是做了优化。...你可能还记得在第 10 篇文章《MySQL深入学习第十篇-MySQL为什么有时候会选错索引?》中我提到过,索引统计值是通过采样来估算。...如果把 update 计数表放到事务第一个语句,多个业务表同时插入数据的话,等待时间会更长。 这个答案结论是对,但是理解不太正确

    1.8K10
    领券