精华内容
下载资源
问答
  • 事务update会锁表吗

    千次阅读 2019-02-21 14:31:59
    1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。 命令:select @@autocommit; 结果如下: +--------------+ | @@autocommit | +--------------+ | 0 | +-----...

    两种情况:

    1.带索引  2.不带索引

    前提介绍:

    方式:采用命令行的方式来模拟

    1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。

    命令:select @@autocommit;

    结果如下:

    +--------------+
    | @@autocommit |
    +--------------+
    |            0 |
    +--------------+

    如果是1,那么运行命令:set autocommit = 0;设置为不开启自动提交

    2.当前的数据库表格式如下

    tb_user | CREATE TABLE `tb_user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(32) DEFAULT NULL,
      `phone` varchar(11) DEFAULT NULL,
      `operator` varchar(32) DEFAULT NULL,
      `gmt_create` datetime DEFAULT NULL,
      `gmt_modified` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

    显然除了主键,我没有加任何索引

     

    实际例子:

    1.没有索引

    运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name="c1";修改,先别commit事务。

    再开一个窗口,直接运行命令:update tb_user set phone=22 where name="c2";会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。

    2.给name字段加索引

    create index index_name on tb_user(name);

    然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name="c1";先不提交

    然后另一个运行update tb_user set phone=22 where name="c2";发现命令不会卡住,说明没有锁表

    但是如果另一个也是update tb_user set phone=22 where name="c1";更新同一行,说明是锁行了

    3.总结

    如果没有索引,所以update会锁表,如果加了索引,就会锁行

     

    转自:https://www.cnblogs.com/wodebudong/articles/7976474.html

    展开全文
  • Mysql 事务中Update 会锁表吗

    千次阅读 2020-10-12 10:20:56
    Mysql 事务中Update 会锁表吗? 两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。 命令:...

    Mysql 事务中Update 会锁表吗?

    两种情况:

    1.带索引 2.不带索引

    前提介绍:

    方式:采用命令行的方式来模拟

    1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。

    命令:select @@autocommit;

    结果如下:

    
    +--------------+
    | @@autocommit |
    +--------------+
    |      0 |
    +--------------+
    

    如果是1,那么运行命令:set autocommit = 0;设置为不开启自动提交

    2.当前的数据库表格式如下

    
    tb_user | CREATE TABLE `tb_user` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT,
     `name` varchar(32) DEFAULT NULL,
     `phone` varchar(11) DEFAULT NULL,
     `operator` varchar(32) DEFAULT NULL,
     `gmt_create` datetime DEFAULT NULL,
     `gmt_modified` datetime DEFAULT NULL,
     PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
    
    

    显然除了主键,我没有加任何索引

    实际例子:

    1.没有索引

    运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name="c1";修改,先别commit事务。

    再开一个窗口,直接运行命令:update tb_user set phone=22 where name=“c2”;会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。

    2.给name字段加索引

    create index index_name on tb_user(name);

    然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name="c1";先不提交

    然后另一个运行update tb_user set phone=22 where name="c2";发现命令不会卡住,说明没有锁表

    但是如果另一个也是update tb_user set phone=22 where name="c1";更新同一行,说明是锁行了

    3.总结

    如果没有索引,所以update会锁表,如果加了索引,就会锁行

    展开全文
  • update会锁表吗

    万次阅读 2018-05-25 17:11:46
    update会锁表吗? 两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。 命令:select @@...

    转载自:
    https://www.cnblogs.com/wodebudong/articles/7976474.html
    update会锁表吗?
    两种情况:

    1.带索引 2.不带索引

    前提介绍:

    方式:采用命令行的方式来模拟

    1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。

    命令:select @@autocommit;

    结果如下:

    +————–+
    | @@autocommit |
    +————–+
    | 0 |
    +————–+

    如果是1,那么运行命令:set autocommit = 0;设置为不开启自动提交

    2.当前的数据库表格式如下

    tb_user | CREATE TABLE tb_user (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    name varchar(32) DEFAULT NULL,
    phone varchar(11) DEFAULT NULL,
    operator varchar(32) DEFAULT NULL,
    gmt_create datetime DEFAULT NULL,
    gmt_modified datetime DEFAULT NULL,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

    显然除了主键,我没有加任何索引

    实际例子:

    1.没有索引

    运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name=”c1”;修改,先别commit事务。

    再开一个窗口,直接运行命令:update tb_user set phone=22 where name=”c2”;会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。

    2.给name字段加索引

    create index index_name on tb_user(name);

    然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name=”c1”;先不提交

    然后另一个运行update tb_user set phone=22 where name=”c2”;发现命令不会卡住,说明没有锁表

    但是如果另一个也是update tb_user set phone=22 where name=”c1”;更新同一行,说明是锁行了

    3.总结

    如果没有索引,所以update会锁表,如果加了索引,就会锁行

    分类: mysql

    展开全文
  • update语句关联的锁机制一、update会锁表吗?1.不带索引2.带索引3.总结4.扩展查看数据的事务设置 一、update会锁表吗? 1.不带索引 运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where ...

    一、update会锁表吗?

    1.oracle中,update会形成行锁

    update tb_user set phone=11 where name=”c1”;修改,先别commit事务。
    重新开另一个窗口,执行select * from tb_user where name = “c1”,可以进行查询。但执行update tb_user set phone=11 where name=”c1”;命令会显示一直在执行中。当第一个update tb_user set phone=11 where name=”c1”;更新语句提交commit后,第二条语句才会执行。

    2.oracle利用该机制实现分布式锁

    select * from tb_user where name = “C1” for update;
    使用在储存过程中。后续再进行提交commit指令。多个实例需要等待第一个实例完成命令后才能进行操作。

    3.java利用该机制实现分布式锁

    package work;
    
    import com.alibaba.fastjson.JSON;
    
    import java.util.*;
    
    public class OracleSuoStudy {
    
        // dao层
        private OracleStudy oracleStudy;
    
    
    
        public void beginSuo(){
            try {
                // 当前线程名字
                String lockValue = Thread.currentThread().getName();
                // 得到一个批次号
                String batchNo = UUID;
                if(this.lock("studySuo",new Date(System.currentTimeMillis() + 1000*60*10),lockValue)){
                // 将批次号为空的批次更新为UUID,更新的时候保证只有一台实例在运行更新
                	oracleStudy.updateBatch(UUID);
                    int seconds = 500 + Integer.decode(UUID.randomUUID().toString());
                //执行业务代码
    			// 根据批次号,将这批数据查出来
    			List<T> list = oracleStudy.queryDataByBatchNo(UUID);
                   
                } esle {
    		 	log.info("获取锁失败");
                Thread.sleep(seconds);
    			}
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 解锁
    
            }
    
    
        }
    
    
        private synchronized boolean lock (String configID, Date aviableTime,String lockValue){
            Map map = new HashMap();
            map.put("configID",configID);
            map.put("aviableTime",aviableTime);
            map.put("lockValue",lockValue);
            // 第一条SQL 查询锁
            Long c = oracleStudy.querySuo(map);
            //第二条SQL  解超时锁
            log.info("先尝试解超时锁" + oracleStudy.updateSwitch(map) + ","+ JSON.toJSONString(map));
            boolean flag = false ;
    
            if (c.intValue() == 0){
                // 第三条SQL创建一个新锁
                oracleStudy.createSuo(map);
                flag = true;
            } else {
                // 第四条SQL,查询锁的状态
                String value = oracleStudy.querySuoStatus(map);
                if (value.equals("1")){
                    // 已经加锁
                    flag = false;
                } else {
                    // 第五条SQL 尝试加锁
                    flag = oracleStudy.updateSuostatus(map);
                }
    
            }
            return flag;
    
        }
    }
    
    

    Dao层SQL代码

    ---查看是否存在锁
    @Select("select count(1) from config_info  where config_type  = 'djssJobType' and config_id = 'smsSendLock'")
    一、querySuo
    
    ---尝试解开超时锁
    @update("update config_info set config_value = '0' ,updated_date = sysdate where config_type = 'dissJobType' and config_id = 'smsSendLock' and (updated_date < sysdate -1 or Avilable_date < sysdate)")
    二、updateSwitch
    
    ---第一次执行的时候需要创建锁
    @insert("insert into config_info (config_type,config_id,config_value,available_date) values ('djssJobType','smsSendInitLock','1','6000000' || sysdate)")
    三、createSuo
    
    
    ----查看锁的状态
    @select("select config_value from config_info where config_type = 'djssJobType' and config_id = 'smsSendInitLock'")
    四、querySuoStatus
    
    
    ---若锁的状态没有加锁,则对其进行加锁操作
    @update("update config_info set config_value = '1',updated_date = sysdate,available = '时间' where config_type = 'djssJobType' and config_value = '0' and config_id = 'smsSendInitLock'")
    五、updateSuostatus
    

    2.不带索引

    运行命令:begin;开启事务,然后运行命令:update tb_user set phone=11 where name=”c1”;修改,先别commit事务。

    再开一个窗口,直接运行命令:update tb_user set phone=22 where name=”c2”;会发现命令卡住了,但是当前面一个事务通过commit提交了,命令就会正常运行结束,说明是被锁表了。

    2.带索引

    create index index_name on tb_user(name);

    然后继续如1里面的操作,也就是一个开启事务,运行update tb_user set phone=11 where name=”c1”;先不提交

    然后另一个运行update tb_user set phone=22 where name=”c2”;发现命令不会卡住,说明没有锁表

    但是如果另一个也是update tb_user set phone=22 where name=”c1”;更新同一行,说明是锁行了

    3.总结

    当更新条件有索引时,update会锁行。当更新条件无索引时,update会锁表。

    4.扩展查看数据的事务设置

    mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开启了自动提交事务。

    命令:select @@autocommit;

    如果结果是1,则说明数据库是自动提交,如果是0则说明数据库没有开启自动提交。

    展开全文
  • 在同一时刻,可能有多个客户端对同一张进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了的概念。 的分类 从对数据库操作的类型...
  • 数据库锁 因为数据库要解决并发控制问题。在同一时刻,可能有多个客户端对同一张进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了...
  • 文章目录1.数据库你了解吗2.按照的粒度分数据库有哪些2.1、MyISAM和InnoDB存储引擎使用的:2.2、行级和页级对比3.按照的类别分MySQL都有...当数据库有并发事务的时候,就产生数据不一致的
  • mssql2005,经常会锁死sp_lock,产生死锁的原因是两个事务先后锁定某些,导致无限互相等待锁释放。 一般都是update操作才会死锁吧?像select sum group by inner join 查询非常耗时这些语句会导致死锁吗?
  • 数据库

    2019-12-10 17:04:00
    1.用什么数据库(mysql),mysql基本语句写吗2.写了四句SQL语句让我说执行结果(其中一句有涉及到和脏读什么的) MySQL存储引擎及区别主键索引和非主键索引的区别 怎么合并两个而不用left join 事务处理 还有一些...
  • 然后在该事务范围内启动两个并发的线程,连接到数据库对同一张级别的X并长时间持续占有,请问这种情况这两个线程的其中一个连接Block住另外一个线程的连接吗? 如果,那岂不是两个数据库连接...
  • 数据库出现一条等待的数据,然后running那条数据一直通过不了,住的请求一直超时,导致这张表就被了,只有将程序关停,等之前那条running状态的数据通过后,才能正常...
  • 今天来细说一下Mysql中的三类,分别是全局、行级。 全局 全局简单的说就是住整个数据库实例,命令是Flush tables with read lock。当你需要为整个数据库处于只读的状态的时候,可以使用这个...
  • 看完MySQL全局和表锁,你废了吗?

    千次阅读 2020-07-19 23:58:14
    数据库也需要合理控制资源的访问规则,而就是用来实现这些访问规则的数据结构。 根据加锁的范围,MySQL里面的大致可以分成 全局 行锁 今天先说全局。 全局 对整个数据库实例加锁。MySQL...
  • 亲,你遇到过数据库里的访问全部在Client Java层里看到是慢日志过吗? 亲,你遇到某个Client突然宕机,正在事务操作中的SQL,最后回滚,但是不会对别的Client有影响呢? 例如这样: X事务突然中止 ,其它...
  • 翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从...
  • 翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从...
  • 1、概念 ,在现实生活中是为我们想要隐藏于外界所使用的一种工具,在计算机中,是...在购买商品时, 商品库存只有1个时 ,两个人同时买时, 谁买到的问题,用到事务, 先从库存中取出物品的数据, 然后插入订单,付
  • 5.4 简单的Oracle数据库事务 153 5.5 提交和回滚 154 5.5.1 提交一个事务 154 5.5.2 回滚一个事务 155 5.6 数据一致性和数据并发性 155 5.6.1 数据库写入器和写前协议 155 5.6.2 SCN 156 5.6.3 撤销...
  • 隔离级别 Read-Uncommitted(读未提交):产生脏读的问题.比如事务A增加了一条数据,此时事务B正好读到了这笔...其实是这样的,提交是指事务整体的提交,一个事务通常包括多步对数据库的操作,举个例子:有一张学生,字
  •  本书是一本关于oracle database 9i、10g 和11g 数据库体系结构的权威图书,涵盖了所有重要的oracle 体系结构特性,包括文件、内存结构和进程,和闩,事务、并发和多版本,和索引,数据类型,分区和并行,以及...
  • Tree索引不同的实现方式索引优化联合索引最左匹配原则索引建立的越多越好吗二、调优sqlexplain 查看执行计划三、锁模块MyISAM与InnoDB关于锁方面的区别是什么级锁会锁住整张表表级别的读锁:读锁也叫共享锁:即一...
  • 第10章 数据库表 335 10.1 类型 335 10.2 术语 337 10.2.1 段 337 10.2.2 段空间管理 339 10.2.3 高水位线 340 10.2.4 freelists 342 10.2.5 PCTFREE和PCTUSED 345 10.2.6 LOGGING和NOLOGGING 348 10.2.7...
  •  本书是一本关于Oracle 9i & 10g数据库体系结构的权威图书,涵盖了所有最重要的Oracle体系结构特性,包括文件、内存结构和进程,和闩,事务、并发和多版本,和索引,数据类型,以及分区和并行,并利用具体的...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

数据库事务会锁表吗