• mysql 事务的实用小实例


    mysql中事务想必大家都接触过,尽管你没有接触过事务,那起码你也应该听说过事务的一些概念。今天,我先不讲那些文邹邹的概念什么的,我直接给大家讲解一下它的一些常用运用。
    按照书上或者是一些网上的教材来说,事务只支持innodb引擎的。不过,在我看了书之后,按我的理解,事务其实也存在于MyISAM,只是来说它的意义有些不太一样。
    先来说说我们工作中常用的innodb引擎吧。我们都知道,在mysql5.7以后,它的默认引擎就是innodb,可能这也就是为了吏好的兼容事务而设计的吧(这也是我猜想的)。innodb事务是由锁构成。而它这个锁,通常有两种,一种是共享锁,另一种是排他锁。

    共享锁,也叫是共享读锁,也就是多个事务之间,只能读取,不能做修改。

    set autocommit = 0; ----让事务不自动提交(默认是自动提交的)
    select * from table1 where id = 5 lock in share mode;
    commit; ----提交
    
    • 1
    • 2
    • 3

    如果说第一个事务先获得了这个锁,那么,其他事务也只能获取共享读锁(不能是排他锁,不然,其他锁将会出现等待而卡住)

    排他锁,也叫写锁。也就是多个事务之间,只能有一把锁是能读能写的状态,如果其他锁强进行来,那将会是等等而卡住。只有当前的事务提交后,后面的事务才能执行。

    set autocommit = 0;
    select * from table1 where id = 5 for update;
    commit ;
    
    • 1
    • 2
    • 3

    当然,这儿有个需要注意的地方,那就是这两个共享锁和排他锁其实是行级锁,也就是只能是锁行的,并不能锁表。当然,这也是需要基于主键或者是索引。这儿我就先不展开来讲了。简单来说,如果事务的表没有主键或者是索引,那它就会成为“表”锁。

    前面我也说了,从某种方面来说,MyISAM引擎也有索的概念。是的,只是来说MyISAM引擎它是表级锁。所谓表级锁,也就是说如果某个事务加了锁之后,另一个事务就会等待。

    lock tables myTableName read #读锁,在这种情况下,所有的事务都只有读的权限,如果执行写入,则会报错。
    #在这个阶段,当前事务能对当前表执行读的操作,而其他事务执行查询时,读到的是旧的数据。
    unlock tables #执行提交后,其他事务才能执行写的操作。
    
    • 1
    • 2
    • 3
    lock tables myTableName write #写锁,在这种呢况下,基他事务不能读,也不能写。需要等到当前事务提交后,基他事务才能执行读和写。
    #在这个阶段,当前事务能对当前事务执行读和写的操作,而其他事务如果强行进入(不管是读锁还是写锁),则会等待而卡住。
    unlock tables #事务提交后,其他事务才能继续。
    
    • 1
    • 2
    • 3
  • 相关阅读:
    OpenCV官方教程中文版 —— 直方图均衡化
    计算机毕设(附源码)JAVA-SSM基于的图书馆管理系统
    项目——boost搜索引擎
    建模的常用手段:组合和聚合
    java集合框架综述
    Java虚拟机内存模型
    编码器如何控制单相霍尔电机。只有一路霍尔信号,电机只能正转不能反转。能移植野火Pid控制吗
    【VLN学习内容LIST】
    【学习笔记】RabbitMQ-5 消息的可靠性投递 以及示例代码
    QNetworkAccessManager 实现文件上传下载-同步异步两种方式
  • 原文地址:https://blog.csdn.net/weixin_42371812/article/details/126685293