mysql 锁(标贝科技)

2023-05-16

标贝科技 https://ai.data-baker.com/#/?source=qwer12

填写邀请码fwwqgs,每日免费调用量还可以翻倍
在这里插入图片描述
在这里插入图片描述

mysql 锁

锁类型

类型

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

    • 这些存储引擎通过总是一次性同时获取所有需要的锁以及总是按相同的顺序获取表锁来避免死锁。
    • 表级锁更适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高

    • 最大程度的支持并发,同时也带来了最大的锁开销
    • 在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,这就决定了在 InnoDB 中发生死锁是可能的
    • 行级锁只在存储引擎层实现,而Mysql服务器层没有实现。 行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

锁粒度和兼容

意向锁

  • 实际应用中InnoDB许多行级锁与表级锁共存

  • 未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向(在索引树上打一个标记,其他表锁看到意向锁必须等待)

意向锁分类:

  • 意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行加共享S锁

  • 意向排它锁(intention exclusive lock, IX),它预示着,事务有意向对表中的某些行加排它X锁

意向锁获取

  • 事务要获得某些行的S锁,必须先获得表的IS锁
  • 事务要获得某些行的X锁,必须先获得表的IX锁
意向锁的兼容
  • InnoDB使用共享锁,可以提高读读并发
  • 为了保证数据强一致,InnoDB使用强互斥锁,保证同一行记录修改与删除的串行性
  • InnoDB使用插入意向锁,可以提高插入并发
  • 由于意向锁仅仅表明意向,它其实是比较弱的锁,意向锁之间并不相互互斥,可以并行
意向共享锁(IS)意向排他锁(IX)共享锁(S)排他锁(X)
意向共享锁(IS)兼容兼容兼容不兼容
意向排他锁(IX)兼容兼容不兼容不兼容
共享锁(S)兼容不兼容兼容不兼容
排他锁(X)不兼容不兼容不兼容不兼容

锁冲突兼容

Gap(间隙锁)Insert Intention(插入意向锁)Record(行锁)Next-Key
Gap(间隙锁)兼容兼容兼容兼容
Insert Intention(插入意向锁)冲突兼容兼容冲突
Record(行锁)兼容兼容冲突冲突
Next-Key兼容兼容冲突冲突

InnoDB 锁实现方式

行锁

  • InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与 Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁
  • 不论是使用主键索引、唯一索引或普通索引,InnoDB 都会使用行锁来对数据加锁
  • 只有执行计划真正使用了索引,才能使用行锁:即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价来决定的,如果 MySQL 认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下 InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时
    别忘了检查 SQL 的执行计划(可以通过 explain 检查 SQL 的执行计划),以确认是否真正使用了索引
  • 由于 MySQL 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然多个session是访问不同行的记录, 但是如果是使用相同的索引键, 是会出现锁冲突的(后使用这些索引的session需要等待先使用索引的session释放锁后,才能获取锁)。 应用设计的时候要注意这一点

间隙锁

  • 间隙锁的目的是为了防止幻读,其主要通过两个方面实现这个目的:防止间隙内有新数据被插入

  • innodb自动使用条件:

    1.事务级别在RR级别下
    2.检索条件必须有索引(没有索引的话,mysql会全表扫描,那样会锁定整张表所有的记录,包括不存在的记录,此时其他事务不能修改不能删除不能添加)

  • 对记录之间的间隙锁定

next-key锁

  • next-key锁的目的是解决可重复度
  • 实现方案:间隙锁+行锁

隔离级别和锁

rc更新

更新事务更新事务
聚集索引行锁等待
范围(聚集索引)Gap锁范围内等待,范围外直接执行
无索引(所有记录加锁,不符合记录解锁,符合记录锁定,锁定记录过多会升级为表锁)锁定记录等待,非锁定记录执行(锁定记录过多,升级为表锁)

rc 插入

更新事务插入事务
行锁无影响
范围(聚集索引)无影响
无索引查询(所有记录加锁,不符合记录解锁,符合记录锁定)无影响

rr更新

更新事务更新事务
聚集索引行锁等待
范围(聚集索引)Next-key锁范围内等待,范围外直接执行
无索引(所有记录加锁,不符合记录解锁,符合记录锁定,锁定记录过多会升级为表锁)锁定记录等待,非锁定记录执行(锁定记录过多,升级为表锁)

rr插入

更新事务插入事务
行锁无影响
范围(聚集索引)Next-key锁范围内等待,范围外直接执行
无索引查询(所有记录加锁,不符合记录解锁,符合记录锁定,锁定记录过多会升级为表锁)锁定记录等待,非锁定记录执行(锁定记录过多,升级为表锁)

一致性非锁定读原理(MVCC)

多版本并发控制。MVCC是一种并发控制的方法。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读

当前读和快照读

  • 当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁
  • 快照读:不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本
  • MVCC就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现

MVCC原理

依赖记录中的 3个隐式字段undo日志Read View

隐式字段

  • DB_TRX_ID:6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID
  • DB_ROLL_PTR:7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
  • DB_ROW_ID:6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引

undo日志

  • insert undo log
    代表事务在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
  • update undo log
    事务在进行updatedelete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除

undolog记录流程

1. 开启事务,修改该行(记录)数据时,数据库会先对该行加`排他锁`
2. 在`undo log`中增加当前行的拷贝副本
3. 拷贝完毕后,修改该行`name`为标贝科技,并且修改隐藏字段的事务ID为当前`事务1`的ID, 我们默认从`1`开始,之后递增,回滚指针指向拷贝到`undo log`的副本记录,既表示我的上一个版本就是它
4. 事务提交后,释放锁

执行事务

序号nameageDB_TRX_ID(事务id)DB_ROLL_PTR(回滚指针)DB_ROW_ID(隐藏主键)
2标贝科技2510x1012121

undolog日志:

序号nameageDB_TRX_ID(事务id)DB_ROLL_PTR(回滚指针)DB_ROW_ID(隐藏主键)
1皮皮檀25nullnull1
1. 开启事务,修改该行数据,数据库先为该行加锁
2. 把该行数据拷贝到`undo log`中,作为旧记录,发现该行记录已经有`undo log`了,那么最新的旧数据作为链表的表头,插在该行记录的`undo log`最前面
3. 修改该行`age`为18岁,并且修改隐藏字段的事务ID为当前`事务2`的ID, 那就是`2`,回滚指针指向刚刚拷贝到`undo log`的副本记录
4. 事务提交,释放锁

执行事务

序号nameageDB_TRX_ID(事务id)DB_ROLL_PTR(回滚指针)DB_ROW_ID(隐藏主键)
3标贝科技1820x1012661

undolog日志:

序号nameageDB_TRX_ID(事务id)DB_ROLL_PTR(回滚指针)DB_ROW_ID(隐藏主键)
2标贝科技2510x1012121
1皮皮檀25nullnull1

序号3、2、1通过回滚指针串联起来

Read View

  • 事务进行快照读操作的时候生产的读视图(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)
  • Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的DB_TRX_ID(即当前事务ID)取出来,与系统当前其他活跃事务的ID去对比(由Read View维护),如果DB_TRX_ID跟Read View的属性做了某些比较,不符合可见性,那就通过DB_ROLL_PTR回滚指针去取出Undo Log中的DB_TRX_ID再比较,即遍历链表的DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的DB_TRX_ID, 那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本

ReadView和事务

  • read uncommitted隔离级别事务:直接读取记录的最新版本

  • serializable隔离级别事务:使用加锁的方式来访问记录

  • RC和RR隔离级别事务:需要用到版本链概念,核心问题是如何判断版本链中哪个版本是当前事务可见的

  • readview中四个比较重要的概念:

    • m_ids:表示在生成readview时,当前系统中活跃的读写事务id列表
    • min_trx_id:表示在生成readview时,当前系统中活跃的读写事务中最小的事务id,也就是m_ids中最小的值
    • max_trx_id:表示生成readview时,系统中应该分配给下一个事务的id值
    • creator_trx_id:表示生成该readview的事务的事务id
  • 有了readview,在访问某条记录时,按照以下步骤判断记录的某个版本是否可见

    • 1、如果被访问版本的trx_id,与readview中的creator_trx_id值相同,表明当前事务在访问自己修改过的记录,该版本可以被当前事务访问

    • 2、如果被访问版本的trx_id,小于readview中的min_trx_id值,表明生成该版本的事务在当前事务生成readview前已经提交,该版本可以被当前事务访问

    • 3、如果被访问版本的trx_id,大于或等于readview中的max_trx_id值,表明生成该版本的事务在当前事务生成readview后才开启,该版本不可以被当前事务访问

    • 4、如果被访问版本的trx_id,值在readview的min_trx_id和max_trx_id之间,就需要判断trx_id属性值是不是在m_ids列表中

      • 如果在:说明创建readview时生成该版本的事务还是活跃的,该版本不可以被访问
      • 如果不在:说明创建readview时生成该版本的事务已经被提交,该版本可以被访问
  • 生成readview时机

    • RC隔离级别:每次读取数据前,都生成一个readview
    • RR隔离级别:在第一次读取数据前,生成一个readview
      在这里插入图片描述
struct trx_t {
    /* 事务ID */
    trx_id_t    id;        /*!< transaction id */
    /* 一致性读的快照 */
    ReadView*    read_view;    /*!< consistent read view used in the transaction, or NULL if not yet set */
    // 省略一大堆属性...
}

class ReadView {
    /**
     * 创建这个快照的事务ID
     */
    trx_id_t    m_creator_trx_id;
    /**
     * 生成这个快照时处于活跃状态的事务ID的列表,
     * 是个已经排好序的列表
     */
    ids_t        m_ids;
    /** 
     * 高水位线:id大于等于 m_low_limit_id 的事务都不可见。
     * 在生成快照时,它被赋值为“下一个待分配的事务ID”(会大于所有已分配的事务ID)。
     */
    trx_id_t    m_low_limit_id;
    /**
     * 低水位线:id小于m_up_limit_id的事务都不可见。
     * 它是活跃事务ID列表的最小值,在生成快照时,小于m_up_limit_id的事务都已经提交(或者回滚)。
     */
    trx_id_t    m_up_limit_id;

    // 判断事务是否可见的方法
    bool changes_visible(){}
    // 关闭快照的方法
    void close(){}
    // ...
}

/* 判断某个事务的修改对当前事务是否可见 */
bool changes_visible(){
        /**
         * 可见的情况:
         *  1. 小于低水位线,即创建快照时,该事务已经提交(或回滚)
         *  2. 事务ID是当前事务。
         */
        if (id < m_up_limit_id || id == m_creator_trx_id) {
            return(true);
        }
        if (id >= m_low_limit_id) { /* 高于水位线不可见,即创建快照时,该事务还没有提交 */
            return(false);

        } else if (m_ids.empty()) { /* 创建快照时,没有其它活跃的读写事务时,可见 */
            return(true);
        }
        /**
         * 执行到这一步,说明事务ID在低水位和高水位之间,即 id ∈ [m_up_limit_id, m_low_limit_id)
         * 需要判断是否属于在活跃事务列表m_ids中,
         * 如果在,说明创建快照时,该事务处于活跃状态(未提交),修改对当前事务不可见。
         */
        // 获取活跃事务ID列表,并使用二分查找判断事务ID是否在 m_ids中
        const ids_t::value_type*    p = m_ids.data();
        return(!std::binary_search(p, p + m_ids.size(), id));
}
bool lock_clust_rec_cons_read_sees()
{
    // 获取修改这个数据行的事务ID
    trx_id_t    trx_id = row_get_rec_trx_id(rec, index, offsets);

    // 调用 changes_visible() 判断是否可见,如果不可见则取查找undolog
    return(view->changes_visible(trx_id, index->table->name));
}

MVCC整体请求流程

针对记录 X 的操作事务(RR或RC隔离级别下)

事务0事务1事务2事务3事务4
事务结束事务开始事务开始事务开始事务开始
事务2开始后修改且已提交
进行中快照读进行中

当前的m_low_limit_id = 4+1=5 、 trx_id_t m_up_limit_id = 1,readView:[事务1,2,3]

m_low_limit_id = 4+1=5 //下一个事务的id
m_up_limit_id = 1	// 活跃的最小事务id
read_view = [事务1,事务2,事务3] //活跃事务
m_creator_trx_id = 2		// 当前事务
    /**
     * 事务2的可查询情况(事务1,3不修改数据)
     *  RC隔离级别下
     *      可以查到事务4提交的数据
     *  RR隔离级别下
     *      可以查到事务0提交的数据
     *
     * 事务2的可查询情况(事务1,3修改数据)
     *  RC隔离级别下
     *      可以查到事务4的数据
     *  RR隔离级别下
     *      可以查到事务0的数据
     */

参考文献
[1]https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_PROTOCOL.html
[2]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_packets.html#sect_protocol_basic_packets_packet
[3]https://www.jianshu.com/p/5e6b33d8945f
[4]https://cloud.tencent.com/developer/article/1768901
[5]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_authentication_methods.html
[6]https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_command_phase.html
[7]https://dev.mysql.com/doc/internals/en/
[8]https://www.cnblogs.com/wyq178/p/11576065.html
[9]Mysql技术内幕:InnoDB存储引擎 (第2版). 姜承尧
[10]MySQL运维内参:MySQL、Galera、Inception核心原理与最佳实践. 周彦伟,王竹峰,强昌金
[11]https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html
[12]https://dev.mysql.com/doc/refman/5.7/en/faqs-innodb-change-buffer.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 锁(标贝科技) 的相关文章

  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • 在mysql中的单个查询中更新多个表

    我有三个查询 我想要一个 这是我的查询 UPDATE tab1 SET a WHERE id 3 UPDATE tab2 SET b WHERE id 9 UPDATE tab3 SET c WHERE id 5 您可以尝试下面的代码 UP
  • 显示标准化数据

    跟进问题 添加 2 个不同表的总和 https stackoverflow com questions 39717541 adding sum from 2 different tables 我创建了3个表 members videos v
  • MySql - 复制监控工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个主 从 MySql 复制 我正在寻找一个允许我监视复制的工具 查看它没有错误 检查滞后等 我更喜
  • 海量记录的bulk_create最佳实践

    I use bulk create将 1 mio 记录插入到新表中 需要 80 秒 Django 只使用一个 CPU 核心 大约 25 CPU 但没有一个核心达到 100 我相信有改进的潜力 这是代码 class Stock models
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • covertJSONtoSQL 在 NiFi 中返回空值

    我正在设计一项工作 使用以下命令将数据从 MySQL 中的数据库转移到另一个数据库 MySQL 执行SQL处理器随后将Avro转换为Json then 将Json转换为SQL then PutSQL如下流程图所示 将JSON转换为SQL返回
  • MySQL 通过 current_timestamp 选择上个月的数据

    直到今天 当我使用 MySQL 并需要对日期 时间执行操作时 我使用带有 unix 时间戳的 int 列 没有出现任何问题 但今天在阅读了一些指南后 我决定默认使用 current timestamp 测试时间戳列 所以我感兴趣如何按列选择
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 如何在 SEQUELIZE (nodeJS) 中创建触发器?

    我正在尝试使用sequelize 创建一个触发器 主要思想是创建一个实例CONFIG创建后USER USER MODEL module exports function sequelize DataTypes var User sequel
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同

随机推荐

  • [PYTHON]修改当前进程环境变量

    myenv 61 os environ myenv 34 PATH 34 61 34 xxxx 34 43 myenv 34 PATH 34 注意 xff1a 此方法仅在python的当前进程中生效 xff0c 如果此时通过subproce
  • SO库版本号管理

    一 输入版本号 功能由Cmake软件实现 1 建立一个空白txt xff0c 重命名为config h in 输入代码 xff1a defineMAJOR VERSION 64 MAJOR VERSION 64 defineMINOR VE
  • VINS-MONO实践

    1 配置ros xff08 运行VINS需要 xff0c 记得换源 xff0c 会快一些 xff09 sudo apt get install ros melodic cv bridge ros melodic tf ros melodic
  • EuRoC数据集介绍

    数据集官网 xff1a https projects asl ethz ch datasets doku php id 61 kmavvisualinertialdatasets EuRoC数据集 微型飞行器 xff08 MAV xff09
  • TUM数据集

    TUM数据集下载链接 https vision in tum de data datasets rgbd dataset download https vision in tum de data datasets visual inerti
  • evo评测VINS-MONO---指标解析、算法精度分析(数据集)

    上篇博文已通过代码修改 数据格式转换 数据测试实现使用evo评测VINS MONO xff0c 该篇将详细介绍evo评测出的数据指标 xff0c 以及VINS MONO在数据集下的精度情况 EVO评价指标介绍 绝对轨迹误差 xff08 AT
  • ZED2相机说明书

    经前期调研及摄像头参数对比 xff0c 最终选择STEREOLABS公司的ZED2双目立体摄像头作为后期VINS系统的硬件平台 xff0c 下面先给出ZED2 的产品说明书 产品特点 1 空间目标检测 根据空间环境检测和跟踪对象 通过结合A
  • 解决NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver

    问题解决 终端输入 xff1a nvidia smi NVIDIA span class token operator span SMI has failed because it couldn span class token numbe
  • Mysql 事务(标贝科技)

    文章目录 事务InnoDB对ACID的支持隔离级别不同隔离级别下读读取数据可能出现的情况不可重复读和幻读区别 redo log xff08 共享表空间 xff09 redo log block刷redo log策略 xff1a innodb
  • Ubuntu20.04运行Vins-fusion

    因已安装ROS noetic xff0c eigen xff0c opencv及ceres等库 xff0c 这部分环境配置就不细讲 xff0c 直接下载VINS FUSION的代码库 下载编译 cd span class token ope
  • 坐标系之间的转换关系(ECEF、LLA、ENU)

    一 坐标系简介 1 ECEF坐标系 也叫地心地固直角坐标系 其原点为地球的质心 xff0c x轴延伸通过本初子午线 xff08 0度经度 xff09 和赤道 xff08 0deglatitude xff09 的交点 z轴延伸通过的北极 xf
  • Python画图常用的颜色及标识

    matplotlib中color可用的颜色 xff1a aliceblue F0F8FF antiquewhite FAEBD7 aqua 00FFFF aquamarine 7FFFD4 azure F0FFFF beige F5F5DC
  • .npy文件打开方式

    在用evo评测slam算法定位精度时 xff0c 使用 save results a zip 生成的结果中包含的 npy文件 xff0c 如果要查看里面详细的数值 xff0c 则可通过以下方式打开文件并查看 1 xff09 找到要查看的 n
  • IMU误差模型简介及VINS使用说明

    1 IMU误差来源 2 IMU噪声模型 Noise and Bias kalibr中的imu noise model 参考 xff1a https github com ethz asl kalibr wiki IMU Noise Mode
  • 泰勒公式(泰勒展开式)通俗介绍+本质详解

    比较通俗地讲解一下泰勒公式是什么 泰勒公式 xff0c 也称泰勒展开式 是用一个函数在某点的信息 xff0c 描述其附近取值的公式 如果函数足够平滑 xff0c 在已知函数在某一点的各阶导数值的情况下 xff0c 泰勒公式可以利用这些导数值
  • Leetcode ->94 二叉树的中序遍历

    题目 算法思路及代码实现 span class token macro property span class token directive hash span span class token directive keyword inc
  • Unix、UTC、GPS时间戳及转换

    UTC时间 UTC时间的英文全称 xff1a Universal Time Coordinated xff0c 中文名称 xff1a 协调世界时 俗的理解为 xff0c 这个时间是全世界通用的 xff0c 即全世界都公用的一个时间 可以认为
  • 自动驾驶中地图匹配定位技术总结

    引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术 xff0c 在自动驾驶系统中担负着相当重要的职责 汽车定位涉及多种传感器类型和相关技术 xff0c 主要可分为卫星定位 惯性导航定位 地图匹配定位以及多传感器融合定位几大类 其中地图匹配
  • Firefox 常用扩展插件及脚本推荐 打造你不一样的Firefox

    前言 xff1a 进入2011年以来 xff0c 整个浏览器领域的竞争越发激烈 xff0c 随着IE9正式版的发布 Chrome Opera等浏览器厂商也相继更新 发布了新的版本 经过多次跳票之后 xff0c FireFox4 0正式版终于
  • mysql 锁(标贝科技)

    标贝科技 https ai data baker com source 61 qwer12 填写邀请码fwwqgs xff0c 每日免费调用量还可以翻倍 mysql 锁 锁类型 类型 表级锁 xff1a 开销小 xff0c 加锁快 xff1