表结构:
CREATE TABLE `tab_callback_sms_instant` (
`ID` bigint(15) NOT NULL AUTO_INCREMENT,
`PHONE` varchar(20) DEFAULT NULL,
`SMSCONTENT` varchar(300) DEFAULT NULL,
`CREATTIME` datetime DEFAULT NULL,
`UPDATETIME` datetime DEFAULT NULL,
`TYPE` int(2) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `PHONEINDEX` (`PHONE`),
KEY `typeindex` (`TYPE`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8
操作:1、DELETE FROM tab_callback_sms_instant WHERE TYPE=1
2、update tab_callback_sms_instant set type=1, updatetime=now() where id=****
没弄明白数据库怎么加锁的,如何优化
CREATE TABLE `tab_callback_sms_instant` (
`ID` bigint(15) NOT NULL AUTO_INCREMENT,
`PHONE` varchar(20) DEFAULT NULL,
`SMSCONTENT` varchar(300) DEFAULT NULL,
`CREATTIME` datetime DEFAULT NULL,
`UPDATETIME` datetime DEFAULT NULL,
`TYPE` int(2) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `PHONEINDEX` (`PHONE`),
KEY `typeindex` (`TYPE`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8
操作:1、DELETE FROM tab_callback_sms_instant WHERE TYPE=1
2、update tab_callback_sms_instant set type=1, updatetime=now() where id=****
没弄明白数据库怎么加锁的,如何优化
解决方案 »
- mysql看看我这个存储过程,为什么运行之后多了条数据。
- MYSQL远程启动
- 求一句:相同代码的记录中,日期离现在时间最近的一条记录
- 如何剔除数据库里某个字段中含有的非汉字信息
- 请问mySQL为什么不能执行select top 11 * from Mytable这样的语句?
- 求助一下,怎样增加一个排序字段啊
- win98+tomcat+Mysql(或Oracle8.17)+Jive的配置问题?
- Ubuntu系统mysql服务器开机启动
- mysql备份时会拖慢整台机器性能,有什么调整方案?
- oracle中的unpivot函数,MySQL中怎么代替?
- MYSQL INNODB优化
- mysql占用CPU百分百
谢谢回复,删除数据数量不定,多了也就几百条;
大侠 这条语句数据库怎么加锁?我测试感觉所有行都加锁,update任意一条数据都锁住
2、update tab_callback_sms_instant set type=1, updatetime=now() where id=****
这条type值不等于1 也就是不应该被行锁锁住
我网上看了有个next-key locking有可能这个锁造成的 但我没明白这个范围锁怎么确定范围的
mysql> desc t_innodb;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| a | int(11) | NO | PRI | 0 | |
| b | varchar(5) | YES | MUL | NULL | |
| c | varchar(6) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)两个并发:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update t_innodb set c='sohu' where b='xxx';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0其他session的情况:
mysql> select * from t_innodb;
+----+------+--------+
| a | b | c |
+----+------+--------+
| 1 | xxx | NULL |
| 2 | yyy | NULL |
| 3 | ccc | NULL |
| 4 | ddd | NULL |
| 5 | eee | NULL |
| 6 | aaa | taobao |
| 7 | bbb | baidu |
| 8 | ccc | NULL |
| 9 | ddd | NULL |
| 10 | eee | NULL |
+----+------+--------+
10 rows in set (0.00 sec)
mysql> insert into t_innodb values(11,'aaa','sina');
Query OK, 1 row affected (0.05 sec) mysql> insert into t_innodb values(12,'xxx','sina');
session被阻塞
mysql> insert into t_innodb(a,c) values(12,'sina');
Query OK, 1 row affected (0.06 sec) mysql> insert into t_innodb values(13,'xxy','sina');
session被阻塞
mysql> insert into t_innodb values(13,'yyy','sina');
Query OK, 1 row affected (0.05 sec) mysql> insert into t_innodb values(16,'www','sina');
session被阻塞 mysql> insert into t_innodb values(16,'ddf','sina');
Query OK, 1 row affected (0.05 sec) mysql> insert into t_innodb values(18,'eee','sina');
session被阻塞
mysql> insert into t_innodb values(18,'eed','sina');
Query OK, 1 row affected (0.07 sec)【结论】:b列上的非唯一索引,当‘xxx’行被锁定后,再插入与‘xxx’相同值就会发生阻塞;
只有更新/插入与‘xxx’行无关的行数据时,才不会被阻塞(包括不明确的b列也不会被阻塞)。
对于b列值'xxx'与'yyy'之间,'eee'与'xxx'之间的值的插入和更新都会被阻塞(‘yyy’值的插入和更新不会被阻塞),这就是next-key locking,为了保护session1的可能动作。
即 [eee,xxx]与[xxx,yyy),区间内的b值都会被锁定,即“上闭下开都锁定”。