精华内容
下载资源
问答
  • MySQL之insert update delete 锁表情况

    千次阅读 2019-11-15 10:48:42
    信息: 情况一:有主键,insert 仅仅当前行的数据 事务一: 事务二: 由此可见并没有出现的问题 情况二:有主键,update普通列最后一行 事务一: 事务二: update更新最后一行,会住无穷大。 情况三:...

    表信息:
    MySQL之insert update  delete 锁表情况

    MySQL之insert update  delete 锁表情况
    情况一:有主键,insert 仅仅锁当前行的数据
    事务一:
    MySQL之insert update  delete 锁表情况

    事务二:
    MySQL之insert update  delete 锁表情况

    由此可见并没有出现锁的问题

    情况二:有主键,update普通列最后一行
    事务一:
    MySQL之insert update  delete 锁表情况
    事务二:
    MySQL之insert update  delete 锁表情况
    update更新最后一行,会锁住无穷大。

    情况三:有主键,update普通列多行
    事务一:
    MySQL之insert update  delete 锁表情况
    事务二:
    MySQL之insert update  delete 锁表情况

    update多行产生的范围锁仅仅锁住更新的行。

    情况四;有主键,update 主键最后一列
    事务一:
    MySQL之insert update  delete 锁表情况

    事务二:
    MySQL之insert update  delete 锁表情况

    update按照主键更新,不会出现无穷大的锁

    展开全文
  • http://blog.csdn.net/justdo2008/article/details/4137779 ... SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);已创建。SQL> CREATE OR REPLACE...

    http://blog.csdn.net/justdo2008/article/details/4137779

    http://xiaoxinshome.iteye.com/blog/139609

     

    SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);

    表已创建。

    SQL> CREATE OR REPLACE TRIGGER TR_T
      2  AFTER DELETE ON T
      3  FOR EACH ROW
      4  DECLARE V_COUNT NUMBER;
      5  --PRAGMA AUTONOMOUS_TRANSACTION;
      6  BEGIN
      7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
      8     COMMIT;
      9  END TR_DEL_CABLE;
    10  /

    触发器已创建

    SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);

    已创建 1 行。

    SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);

    已创建 1 行。

    SQL> COMMIT;

    提交完成。

    SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

            ID MC                   TO_CHAR(DT,'YYYYM
    ---------- -------------------- -----------------
             1 111111               20080802 11:07:36
             2 222222               20080802 11:07:43

    SQL> DELETE FROM T WHERE ID=1;
    DELETE FROM T WHERE ID=1
                *
    第 1 行出现错误:
    ORA-04091: 表 TEST.T 发生了变化, 触发器/函数不能读它
    ORA-06512: 在 "TEST.TR_T", line 4
    ORA-04088: 触发器 'TEST.TR_T' 执行过程中出错


    SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

            ID MC                   TO_CHAR(DT,'YYYYM
    ---------- -------------------- -----------------
             1 111111               20080802 11:07:36
             2 222222               20080802 11:07:43

    SQL> CREATE OR REPLACE TRIGGER TR_T
      2  AFTER DELETE ON T
      3  FOR EACH ROW
      4  DECLARE V_COUNT NUMBER;
      5  PRAGMA AUTONOMOUS_TRANSACTION;
      6  BEGIN
      7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
      8     COMMIT;
      9  END TR_DEL_CABLE;
    10  /

    触发器已创建

    SQL> DELETE FROM T WHERE ID=1;

    已删除 1 行。

    SQL> COMMIT;

    提交完成。

    SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

            ID MC                   TO_CHAR(DT,'YYYYM
    ---------- -------------------- -----------------
             2 222222               20080802 11:07:43
             1 111111               20080802 11:08:32

    转载于:https://www.cnblogs.com/daojian/archive/2012/07/31/2616634.html

    展开全文
  • 如下 对账 数据结构create tablet_cgw_ckjnl(CNL_CODEvarchar(10) default ' ' not null comment '通道编码',CNL_PLT_CDvarchar(32) default ' ' not null comment '通道平台号',CNL_TYPvarchar(10) default ' ' ...

    一. 如下 对账表 数据结构

    create tablet_cgw_ckjnl

    (

    CNL_CODEvarchar(10) default ' ' not null comment '通道编码',

    CNL_PLT_CDvarchar(32) default ' ' not null comment '通道平台号',

    CNL_TYPvarchar(10) default ' ' not null comment '通道类型',

    CHK_BAT_NOvarchar(32) default ' ' not null comment '对账批次号',

    BAT_NOvarchar(32) default ' ' not null comment '交易批次号',

    SEQ_NOvarchar(8) default ' ' not null comment '批次序列号',

    CHK_ORD_NOvarchar(64) default ' ' not null comment '对账订单号',

    CHK_TYPvarchar(10) default ' ' not null comment '对账类型',

    CHK_MODvarchar(2) default ' ' not null comment '对账方式(预留:通道订单号、交易批次号+通道订单号、交易批次号+批次序列号)',

    CHK_DTvarchar(8) default ' ' not null comment '对账日期',

    CHK_TMvarchar(6) default ' ' not null comment '对账时间',

    CHK_STSvarchar(1) default '0' not null comment '对账状态',

    REQ_DTvarchar(8) default '0' not null comment '交易请求日期',

    IIF_TYPvarchar(10) default '0' not null comment '接口类型',

    ORD_NOvarchar(32) default '0' not null comment '交易订单号',

    CGW_STSvarchar(2) default ' ' not null comment '交易状态',

    TXN_AMTdecimal(18,2) not null comment '交易金额',

    FEE_AMTdecimal(18,2) default '0.00' not null comment '手续费',

    BAT_FLGvarchar(2) default ' ' not null comment '批量标识(B-批量,S-单笔)',

    FIELDvarchar(64) null comment '备用字段',

    TM_SMPvarchar(26) default ' ' not null comment '时间戳',

    NOD_IDvarchar(32) null comment '交易来源',primary key(CHK_BAT_NO, CHK_ORD_NO)

    )

    comment'对账流水临时表' engine=InnoDB;

    二. 现象

    当两个对账交易同时发生时,因都对这个表执行如下delete操作,当2个delete语句同时发生时,产生死锁。

    sql:

    delete from T_CGW_CKJNL where chk_typ=#{chk_typ} and cnl_code=#{cnl_code} and cnl_plt_cd=#{cnl_plt_cd}

    交易1异常:

    INFO[11-02 13:58:01,697] -> update sql:[delete from T_CGW_CKJNL where chk_typ='SP' and cnl_code='EPCC' and cnl_plt_cd='Z2027533000016' ]

    INFO[11-02 13:58:01,767] -> 对账执行异常,

    java.lang.reflect.UndeclaredThrowableException

    at com.sun.proxy.$Proxy256.deleteCkJnl(Unknown Source)

    at com.murong.ecp.app.bpg.cgw.service.db.CgwCkJnlDBService.deleteCkJnl(CgwCkJnlDBService.java:29)

    at com.murong.ecp.app.bpg.cgw.service.biz.CheckFlowService.check(CheckFlowService.java:352)

    at com.murong.ecp.app.bpg.cgw.service.biz.CheckFlowService.checkExecute(CheckFlowService.java:116)

    at com.murong.ecp.app.bpg.cgw.action.cgwchkbpc1.CheckFlowAction.doProcess(CheckFlowAction.java:61)

    ...

    Nested Exception:

    com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

    sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

    java.lang.reflect.Constructor.newInstance(Constructor.java:423)

    com.mysql.jdbc.Util.handleNewInstance(Util.java:377)

    com.mysql.jdbc.Util.getInstance(Util.java:360)

    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:985)

    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)

    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)

    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)

    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)

    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)

    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)

    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)

    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)

    com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)

    org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)

    org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)

    ...

    java.lang.Thread.run(Thread.java:748)

    交易2异常:

    INFO[11-02 13:58:01,697] -> update sql:[delete from T_CGW_CKJNL where chk_typ='Refund' and cnl_code='EPCC' and cnl_plt_cd='Z2027533000016' ]

    INFO[11-02 13:58:01,767] -> 对账执行异常,

    java.lang.reflect.UndeclaredThrowableException

    ...

    Nested Exception:

    com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

    ...

    三. 解决办法

    MySQL的InnoDB存储引擎支持行级锁,InnoDB的行锁是通过给索引项加锁实现的。这就意味着只有通过索引条件检索数据时,InnoDB才使用行锁,否则使用表锁。

    上面的数据更新语句涉及到的字段chk_typ,cnl_code,cnl_plt_cd上都没有索引,所以并发时导致表被锁。

    解决办法就是为字段chk_typ,cnl_code,cnl_plt_cd添加索引,将数据锁定范围的颗粒度降低为行级锁,这样可以更好的支持并发操作而不产生死锁。

    a11065391dfdf7066cd07d092902eb11.png

    四. 执行计划对比

    EXPLAIN delete from T_CGW_CKJNL where chk_typ='Pay' and cnl_plt_cd='Z20275330000161' and cnl_code='EPCC'

    没有索引时:

    28a81fa3c0b8915b8ecc010810e7bf04.png

    添加索引后:

    0e38e5b41d0eccf0051a3ae656323899.png

    其中,rows表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。可见,没有索引时读取了所有行(表里共33条记录),而添加索引后只读取特定的1行。

    ref:https://www.cnblogs.com/zmduan/p/5033047.html

    展开全文
  • truncate 和 delete 是 MySQL 中清空数据的两种方式,平常使用的时候两者好像都差不多,选谁都可以。实际上它们之间是有本质区别的,只有深入理解了它们的差异,在以后的开发中才能根据具体场景运用自如思考在讲 ...

    ff308c64efceb0a77354e92bb98d825d.png

    truncate 和 delete 是 MySQL 中清空表数据的两种方式,平常使用的时候两者好像都差不多,选谁都可以。实际上它们之间是有本质区别的,只有深入理解了它们的差异,在以后的开发中才能根据具体场景运用自如

    思考

    在讲 truncate 和 delete 的区别之前,不妨先看看下面的问题,带着问题边思考边往下看

    2cb3ae8454a577caaf012a976547149a.png

    问题:如上图所示,红色框(1) 和 红色框(2) 中 id 分别是多少

    delete 简述

    删除表全部数据或者部分数据,删除的时候是一行一行删除的,所以删除表全部数据时速度比较慢

    语句后面可以用 where 过滤待删除的行,比较灵活

    语句执行之后会返回本次删除的行数

    truncate 简述

    删除表全部数据,相当于先 drop table 然后 create table, 速度快语句后面不能接过滤条件语句执行后没有返回值,或者说返回值没有具体的含义

    区别

    虽然 truncate 和 delete 很相似,但它们有以下不同之处

    • delete 是一行一行的删除数据,truncate 是重新创建表,所以truncate 比 delete 速度快,特别是针对大表

    • 其他表有引用本表列的外键字时,truncate 会执行失败,delete 可以执行

    70932c93937dfab002beedbe477ec1f9.png

    上图中 tb 表的 idb 列是ta表的ida列的外键引用truncate table ta 执行失败, truncate table ta 能执行成功

    • truncate 是DDL语句,所以不能回滚,delete 是DML语句,可以回滚

    • truncate 返回值无意义, delete 返回本次删除的行数

    • 针对 AUTO_INCREMENT 列,truncate tablename 会把列值重置为起始值,而 delete from tablename 则不会重置(上面的思考题用到了这条知识点)

    delete 的优化

    前面提到使用 delete 清空大表是速度比较慢,为了保证 delete 语句不会占用大量的时间,可以使用 limit row_count 语句来指定单次删除的最大行数,如果删除的行数大于等于单次删除的最大行数,重复执行 delete 语句直到删除的行数小于单次删除的最大值

    答案

    有了前面的介绍之后,思考题的答案应该很清晰了

    因为表 tt 中 id 列是自增的truncate 清空表数据会重置自增列,而 delete则不会,所以思考题中 (1) 处的 id 分别是 3、4, (2) 处的 id 分别是 1,2

    具体的输出如下图:

    210d55c27e1b56170ec9f1e17443dfc6.png

    展开全文
  • 在工作学习中,有时候我们可能要删除整张表的数据。大多数人可能会说,这还不容易,delete from table_name一条SQL语句,搞定!...但是,truncate不走事务,不会锁表;不会产生日志,不写入日志文件;...
  • 上周五HaC我要上线,有一个脚本需要执行,执行前需要备份一个。运维大佬:“这个的备份为什么要这么久,,??”1秒过去了……2秒过去了……期间运营反馈系统出现大量订单超时情况。大佬找到我,问:“你怎么...
  • 【问题背景】 协议绑卡需要插入绑卡表(A)和签约B) 后台系统需要删除测试数据【问题发现】 线上异常日志不定期出现Deadlock found when trying to get lock【问题分析】 InnoDB的行锁是通过给索引项加锁...
  • 摘要:在业界中有一个比较成熟的工具,针对大表的场景,可以在线进行Alter变更,且不会出现锁表的风险。除此之外,它还有其他的一些优点,让我们开始探索吧。背景大家在日常工作中,往往需要对数据库的表结构做变更...
  • 近日在删除数据时,发现除了常用的Delete & Drop语句之外,还有Truncate也是与删除数据相关的,针对上述三种有进行简单的比较与整理。用法drop用法:drop table 表名drop是DDL,会隐式提交,所以,不能回滚,...
  • mysql delete锁

    千次阅读 2015-05-11 21:32:44
    MYSQL DELETE 1. 有索引且索引值唯一行级 ...2. 其他情况   http://www.databaseskill.com/3505978/ https://blogs.oracle.com/mysqlinnodb/entry/introduction_to_transaction_locks_in ...
  • so,让我们继续刷题吧drop,truncate,delete先养眼,再刷题❤️今天还是好看的小姐姐0QuestionIet me see see这次我们的话题可能有点紧张沉重因为涉及到了删库跑路的环节在面试中,有时候面试官可能会问drop,...
  • 因为,学海无涯呀~语法这个用法的详细语法是这样的:delete from table_name where ... limit row_count。row_count表示行数,必须是单个数字,它会告知服务器在控制命令被返回到客户端前被删除的行的最大值。从而...
  • } 标准库里面实现delete等操作是比较直观的,delete[]调用就是delete,然后调用就是c库的free函数,从基础库实现看,上面调用并没有什么问题。 编译器做了什么? 学过C++都知道,针对C++里面的new A() 不仅仅是分配...
  • 点击上方蓝色字体,选择“设为标星”优质文章,第一时间送达最明显的区别:drop直接删掉truncate删除中数据,再插入时自增长id又从1开始delete删除中数据,可以加where字句。(1) DELETE语句执行删除的过程是...
  • 需要注意的: 不建议一次更新多个字段 删除的字段是索引的一部分会锁表锁表时间跟数据量成正比 缩短字段长度会锁表锁表时间跟数据量成正比 mysql> ALTER TABLE t_test ADD COLUMN column_c int(11) NOT NULL;...
  • 用database老是碰到,执行update,delete,insert就会锁表,然后语句执行无效(直接在会话框中查询会显示有效,但是数据库实际未生效),是因为database的会话框默认是执行完,还要再点击提交的!!! 默认设置为...
  • 索引原理如果一本新华字典假如没有目录,想要查找某个字,就不得不从第一页开始查找,一直找到最后一页(如果要找的字在最后一页),这个过程非常耗时,这种场景相当于数据库中的全扫描的概念,也就是循环中的每一...
  • myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。innodb是基于聚...
  • 在业务场景要求高的数据库中,对于单条...这时就 return 了,否则还会执行完全扫描才 return。效率不言而喻。那么,在日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢?在日常的 SQL...
  • myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。innodb是基于聚...
  • 说到删除数据的关键字,大家记得最多的可能就是delete了然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了现在来介绍另外两个兄弟,都是删除数据的,其实也是很容易理解的老大------drop出没场合:...
  • 发现是mysql的data目录太大了,于是我进入mysql,发现有好几个百万级别的太大了,于是我就删了,一顿操作猛如虎,空间占用还是95%。大佬:“你怎么删的?”我:“我一个 rm -rf / * ”大佬:“???”我:“不对...
  • delete table XXX where ……,卡死。 select * from XXX for update 的时候没有commit,oracle将该记录住了。 先查询锁定记录 Sql代码 SELECT s.sid, s.serial# FROM vlockedobjectlo,dbaobjectsao,...
  • 数据库锁表与解锁 一、mysql 锁定表:LOCK TABLES tbl_nam...数据库锁表与解锁 一、mysql ...在mysql innerDB事务中, 两个事务的update,add,delete操作相互锁表的测试情况 mysql 中的 innerDB 事务锁测试 ......My...
  • myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。innodb是基于聚...
  • 最终发现是oracle锁表导致的。 解决方法: 1.查询oracle数据库被锁的表 SELECT T1.ORACLE_USERNAME,T2.SID,T2.SERIAL# FROM V$LOCKED_OBJECT T1, V$SESSION T2 WHERE T1.SESSION_ID = T2.SID...
  • --首先查看有哪些 --主要是看看有没有自己用户 select /*+ rule */ s.username, decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level, o.owner, o.object_name, o.object_type, s.si...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 976
精华内容 390
关键字:

delete锁表