pt-online-schema-change 修改字段属性产生死锁

  1. 死锁信息如下:

2015-06-15 22:23:18 7f0266772700

*** (1) TRANSACTION:

TRANSACTION 1834696957, ACTIVE 0 sec setting auto-inc lock

mysql tables in use 2, locked 2

LOCK WAIT 4 lock struct(s), heap size 1184, 1 row lock(s), undo log entries 1

MySQL thread id 1008989, OS thread handle 0x7f0265de0700, query id 1925131733 127.0.0.1 huanghualiang Sending data

INSERT LOW_PRIORITY IGNORE INTO `newmall`.`_cash_xxx_new` (`id`, `type`, `name`, `discount`, `amount`, `begintime`, `endtime`, `userid`, `realname`, `code`, `releaseuserid`, `releaseorderid`, `orderid`, `status`, `packetid`, `deleted`, `createtime`, `updatetime`, `openid`, `headimgurl`) SELECT `id`, `type`, `name`, `discount`, `amount`, `begintime`, `endtime`, `userid`, `realname`, `code`, `releaseuserid`, `releaseorderid`, `orderid`, `status`, `packetid`, `deleted`, `createtime`, `updatetime`, `openid`, `headimgurl` FROM `newmall`.`cash_xxx` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ‘168256‘)) AND ((`id` <= ‘174595‘)) LOCK IN SHARE MODE /*pt-online-schema-change 17123 copy nibble*/

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

TABLE LOCK table `newmall`.`_cash_xxx_new` trx id 1834696957 lock mode AUTO-INC waiting

*** (2) TRANSACTION:

TRANSACTION 1834696069, ACTIVE 1 sec fetching rows, thread declared inside InnoDB 2131

mysql tables in use 2, locked 2

1580 lock struct(s), heap size 161320, 3 row lock(s), undo log entries 2

MySQL thread id 1007462, OS thread handle 0x7f0266772700, query id 1925130797 10.162.216.179 xm_mall closing tables

update `cash_xxx` set status = 2 where orderId = 3271393

*** (2) HOLDS THE LOCK(S):

TABLE LOCK table `newmall`.`_cash_xxx_new` trx id 1834696069 lock mode AUTO-INC

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 11019 page no 3462 n bits 184 index `PRIMARY` of table `newmall`.`cash_xxx` trx id 1834696069 lock_mode X locks rec but not gap waiting

*** WE ROLL BACK TRANSACTION (1)

事务1: INSERT LOW_PRIORITY IGNORE INTO `newmall`.`_cash_xxx_new` ....... select ... FROM `newmall`.`cash_xxx` FORCE INDEX(`PRIMARY`) WHERE ((`id` >= ‘168256‘)) AND ((`id` <= ‘174595‘)) LOCK IN SHARE MODE;

wait for:  _cash_xxx_new  自增主键表级别锁

hold:     cash_xxx 表的S锁

事务2:update `cash_xxx` set status = 2 where orderId = 3271393

wait for:cash_xxx 表的X锁

hold:    _cash_xxx_new 的自增锁  (这里是因为pt-online-schema-change 触发器把update 转成replace into 新表)

最后回滚了事务1。

时间: 2024-11-01 18:43:57

pt-online-schema-change 修改字段属性产生死锁的相关文章

orcale 修改字段属性

有些时候,因为没能预料到一些情况的变化,需要修改字段的类型.如果是varchar型,直接增加长度是可以的,但是如果需要修改成其他类型就不能这么做了. 思路:1.增加一个临时列,把需要修改的那个字段的数据,存放在这个临时列中   2.把要修改的字段置空   3.修改字段类型,把临时列中的数据放回该字段中   4.删除临时列   5:OK 具体代码如下: alter table tb add lsl number;--增加临时列 update tb set lsl=dd ,dd=null;--把数据

Mysql - 增量脚本中修改字段属性

在增量部署系统的时候, 经常需要提供增量修改的脚本, 如果是修改存储过程或者自定义函数, 那还是很好改的, 不用担心表功能收到影响. 如果是改字段呢? 首先不知道字段是不是已经在系统里面, 没有的话, 需要新增上去, 有的话, 需不需要修改? 其次, 脚本如果报错, 是否会重复执行一下脚本? 会不会导致别的问题呢? 看脚本里面执行结果报了好多错, 总觉得, 会被运维鄙视一遍. 做开发的, 真受不了别人鄙视自己的东西. 直接用sql去新增, 修改字段, 好像不太行, 经常会有问题. 正所谓, 条条

SQL Server数据库修改字段属性

1:向表中添加字段 Alter table [表名] add [列名] 类型 2: 删除字段 Alter table [表名] drop column [列名] 3: 修改表中字段类型 (可以修改列的类型,是否为空) Alter table [表名] alter column [列名] 类型 4:添加主键 Alter table [表名] add constraint [ 约束名] primary key( [列名]) 5:添加唯一约束 Alter table [表名] add constrai

SQL SERVER数据库的表中修改字段属性被阻止“Prevent saving changes that require table re-creation”

1.启动SQL SERVER,选择工具—>选项,去掉“ 阻止保存要求重新创建表的更改”前面的勾. 2.选择设计器 3.去掉“阻止保存要求重新创建表的更改”前面的对号,点击OK. 重新启动SQL SERVER就可以了 .

二、修改表、字段属性设置、索引设置、约束设置

 字段属性设置 not null 不为空 auto_increment 设定int类型字段的值可以"自增长",即其值无需"写入",而会自动获得并增加 注:此属性必须随同 primary key  或 unique key 一起使用. [primary] key: 设定为主键.是唯一键"加强":也不能重复并且不能使用null,并且可以作为确定任意一行数据的"关键值" unique  [key] : 设定为唯一键:表示该字段的

sql的基本用法-------修改字段默认值和属性

修改表中已有的字段属性 ALTER TABLE 表名 ALTER COLUMN 字段名 varchar(500) --sqlserver建表表时设置字段的默认值 create table 表(id int,name varchar(10) default '张三',age int) --添加字段时设置字段的默认值 alter table 表 add sex char(2) default '男' --为表中现有的字段设置默认值 alter table 表 add constraint DF_ag

修改字段默认值和属性

yuanwen修改表中已有的字段属性 ALTER TABLE 表名 ALTER COLUMN 字段名 varchar(500) --sqlserver建表表时设置字段的默认值 create table 表(id int,name varchar(10) default '张三',age int) --添加字段时设置字段的默认值 alter table 表 add sex char(2) default '男' --为表中现有的字段设置默认值 alter table 表 add constrain

关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的时候,那么这个时候采用可视化编器就不再那么方便了,而应该采用以XML的形式来呈现实体数据,然后用我们常用的编辑手段,复制.粘贴.剪切来快速实现批量修改,下面就来说说批量修改的方法: 1.找到Entity Framework采用DB First模式创建的文件,文件以.edmx结尾,如下图示: 2.选中

mysql中利用sql语句修改字段名称,字段长度等操作

在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的mysql管理工具中完成,但是我们有时为了更方便的管理,会选择写sql语句来实现. 1.修改字段的长度 语法: ALTER TABLE 表名 MODIFY COLUMN 字段名  数据类型(修改后的长度) 例子: 将字段的长度由10改为20 ALTER TABLE attence MODIFY COL