`
xieyj
  • 浏览: 103087 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

mysql锁释放时机(二)

 
阅读更多

       上篇,跟踪了select在事务和非事务下的调用路径,本次跟踪insert下的执行路径。

       insert into test1(aa) values('hello world');

       断点显示的堆栈

#0  lock_release_off_kernel (trx=0xb512ac68) at lock/lock0lock.c:3853
#1  0xb5dca803 in trx_commit_off_kernel (trx=0xb512ac68) at trx/trx0trx.c:853
#2  0xb5dcad19 in trx_commit_for_mysql (trx=0xb512ac68) at trx/trx0trx.c:1582
#3  0xb5dd2838 in innobase_commit_low (trx=0x0) at handler/ha_innodb.cc:1878
#4  0xb5dd5f42 in innobase_commit (hton=0x8f6c2e8, thd=0x982fec0, all=false)
    at handler/ha_innodb.cc:2021
#5  0x082e840a in ha_commit_one_phase (thd=0x982fec0, all=false)
    at handler.cc:1231
#6  0x082e897d in ha_commit_trans (thd=0x982fec0, all=false) at handler.cc:1199
#7  0x0839277d in trans_commit_stmt (thd=0x982fec0) at transaction.cc:239
#8  0x081ec38f in dispatch_command (command=COM_QUERY, thd=0x982fec0,
    packet=<value optimized out>, packet_length=43) at sql_parse.cc:1429
#9  0x081ecaec in do_command (thd=0x982fec0) at sql_parse.cc:731
#10 0x081dc327 in handle_one_connection (arg=0x982fec0) at sql_connect.cc:1146
#11 0x4dfe92db in start_thread (arg=0xb26f4790) at pthread_create.c:296
#12 0x006cf14e in clone () from /lib/libc.so.6

注意红色地方,trans_commit_stmt 为每个语句执行之后都会执行的。

       在事务模式下

       start transaction;

       insert into test1(aa) values('hello world2'); --也是commit之后才出现断点

       commit;

       断点显示之后的堆栈为:

#0  lock_release_off_kernel (trx=0xb512ac68) at lock/lock0lock.c:3853
#1  0xb5dca803 in trx_commit_off_kernel (trx=0xb512ac68) at trx/trx0trx.c:853
#2  0xb5dcad19 in trx_commit_for_mysql (trx=0xb512ac68) at trx/trx0trx.c:1582
#3  0xb5dd2838 in innobase_commit_low (trx=0x0) at handler/ha_innodb.cc:1878
#4  0xb5dd5f42 in innobase_commit (hton=0x8f6c2e8, thd=0x982fec0, all=true)
    at handler/ha_innodb.cc:2021
#5  0x082e840a in ha_commit_one_phase (thd=0x982fec0, all=true)
    at handler.cc:1231
#6  0x082e897d in ha_commit_trans (thd=0x982fec0, all=true) at handler.cc:1199
#7  0x083925fc in trans_commit (thd=0x982fec0) at transaction.cc:136
#8  0x081e7972 in mysql_execute_command (thd=0x982fec0) at sql_parse.cc:4130
#9  0x081ea940 in mysql_parse (thd=0x982fec0, inBuf=0x96fb048 "commit",
    length=6, found_semicolon=0xb26f3f14) at sql_parse.cc:5937
#10 0x081eb82c in dispatch_command (command=COM_QUERY, thd=0x982fec0,
    packet=0x9826231 "commit", packet_length=6) at sql_parse.cc:1049
#11 0x081ecaec in do_command (thd=0x982fec0) at sql_parse.cc:731
#12 0x081dc327 in handle_one_connection (arg=0x982fec0) at sql_connect.cc:1146
#13 0x4dfe92db in start_thread (arg=0xb26f4790) at pthread_create.c:296
#14 0x006cf14e in clone () from /lib/libc.so.6

   二者提交事务的方式是不同的。

   对mysql的一些困惑,为什么在非事务方式下面,select和insert,二者的锁释放的时机也不一样?

一个在JOIN::exec下面的join_free下面直接释放,而insert则在trans_commit_stmt里面释放。统一在trans_commit_stmt释放锁不好吗?出现的调用路径过多,也不好理解,维护起来麻烦,难道又是所谓的为了效率牺牲可读性?

分享到:
评论

相关推荐

    行业-59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.rar

    MySQL数据库在多用户环境下为了保证数据的一致性和完整性,引入了锁机制。...开发者需要根据业务需求和系统性能考虑锁的粒度、锁的获取与释放时机,以及如何有效避免死锁,从而实现高效且一致的数据访问。

    golang实现Redis分布式自旋锁+本地自旋锁

    `lockImpl`结构体包含了用于标识锁的`delId`和`addId`,以及等待锁释放的`wait`通道。`init`函数初始化了这些数据结构,而`run`函数则在一个goroutine中运行,监听`addLock`和`delLock`通道,处理锁的添加和删除操作...

    面试题,涵盖golong、mysql、redis、MongoDB、RabbitMQ、Kafka、Docker等等

    解决方法包括使用 `runtime.SetFinalizer` 设置析构函数来清理资源,或者在合适的时机关闭 Channel。 #### 4. Defer 的作用 Defer 语句允许程序员在函数返回之前执行一些清理工作。当函数中有多个 defer 语句时,...

    中国电子云数据库 Mesh 项目 DBPack 的实践.doc

    这得益于 ETCD 的高效读写性能,特别是在高并发场景下,其低延迟特性确保了全局锁的快速释放,从而提高事务处理能力。 在 AT 模式中,全局锁的释放速度直接影响事务性能。ETCD 的出色性能使得 DBPack 能够快速处理...

    关于Java面试题小集锦

    TCP连接关闭时,需要通过四次挥手释放连接,确保双方确认无数据遗留。 12. **HTTPS** HTTPS基于SSL/TLS协议,提供加密传输和身份验证,比HTTP更安全。 13. **JVM内存模型** JVM内存分为堆、栈、方法区、本地...

    php并发加锁示例

    数据库锁则是通过SQL语句来实现,例如在MySQL中可以使用GET_LOCK()和RELEASE_LOCK()函数来操作锁。而Memcache锁是利用Memcache缓存系统的原子操作来实现分布式锁,通过set和add等命令进行锁的获取与释放。 文章提供...

    JVM问题定位的典型案例分析

    MTR并不与逻辑事务相关联,它主要用于确保数据的一致性,并且在提交时释放页面锁。 - **Log Sequence Number (LSN)**:这是重做日志中的虚拟偏移量,用于表示每个日志条目的位置。 - **日志缓冲区**:用于暂时存储...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.57.docx

    ing 框架中,AOP 通过定义切入点表达式来确定关注点的执行时机,同时支持前置通知、后置通知、异常通知等多种通知类型,实现了代码的复用和简化。 问题 8:什么是线程安全?Java 中有哪些常见的线程安全问题?答案...

    郑州数字马力面试(后台java)经验

    MySQL中实现悲观锁与乐观锁** - **悲观锁**:通过行级锁或表级锁实现。 - **乐观锁**:一般通过版本号字段实现。 **20. 事务隔离级别与Spring中的事务传播行为** MySQL支持四种隔离级别:READ UNCOMMITTED、READ...

    pt-osc在线重建表导致死锁的分析及对应的优化方案1

    - 两个事务分别在等待对方释放锁,形成循环等待,导致死锁。 4. **死锁复现与分析**: - 复现死锁需模拟同样的表结构和数据,以及特定的事务执行顺序。 - 分析日志确定事务的执行次序,结合pt-osc工作原理,可以...

    Java面试宝典

    - `wait()`是`Object`类的方法,会使当前线程等待,直到被其他线程唤醒或达到指定时间,同时会释放对象锁。 8. **实现同步的方式** - 使用`synchronized`关键字。 - 使用`ReentrantLock`类。 - 使用`Semaphore`...

    二十三种设计模式【PDF版】

    主要是介绍各种格式流行的软件设计模式,对于程序员的进一步提升起推进作用,有时间可以随便翻翻~~ 23种设计模式汇集 如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 ...

    2015—2016学年第一学期《数据库技术》A卷1

    3. 使用封锁的三个操作步骤:申请加锁、执行操作、释放锁。 4. 数据模型通常由数据结构、操作集合和完整性约束三部分组成。 5. 数据独立性分为:物理独立性、逻辑独立性。 关系代数和SQL语句题: 这部分涉及学生-...

    Oracle 11g问答题

    - 释放事务中获得的锁。 - 清除事务的重做日志记录。 #### 31. 管理撤销的原则 - 确保有足够的撤销空间。 - 适时清除过期的撤销数据。 - 合理设置撤销保留保证。 #### 32. 侦听器的定义文件及其默认位置 - **...

    疯狂JAVA讲义

    第1章 Java概述 1 1.1 Java语言的发展简史 2 1.2 Java的竞争对手及各自优势 4 1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 ...学生提问:当我们使用编译C程序时,不仅需要指定存放...

Global site tag (gtag.js) - Google Analytics