我有这个MySQL表:
video (id int, name varchar(30), view_count int)
我尝试在计算机上运行以下查询:
update `video` set view_count = view_count + 1 where id = 1;
工作正常。
但是,在将数据库移动到另一台服务器之后,上述更新查询有时会起作用,有时无法正常工作。它没有任何错误消息,但值不会改变。
我试图跑:
update `video` set name = 'testing', view_count = view_count + 1 where id = 1;
名称可以成功更新,但vide_count不会更改..
任何人都知道它是什么问题?
这是MySQL提示符的输出:
update `video` set view_count = view_count + 1 where id = 1;
Query OK, 1 row affected (0.13 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> show create table video \G;
*************************** 1. row ***************************
Table: video
Create Table: CREATE TABLE `video` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(30) default NULL,
`view_count` int(10) default NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> select * from video;
| id | name | view_count |
| 1 | ABC | 8510 |
答案 0 :(得分:1)
MyISAM对任何DML执行完整的表锁定(INSERT,UPDATE,DELETE)
如果视频表是MyISAM,那应该解决这个问题,因为只允许一个人对执行单个DML语句的表具有独占写权限,即使有1000人试图执行
update `video` set name = 'testing', view_count = view_count + 1 where id = 1;
InnoDB围绕您要更新的任何数据执行MVCC。自the default is REPEATABLE-READ起,1000个人可能会在尝试增加view_count之前看到相同的值。因此,如果DB Connection#1将view_count视为12,则递增它,它应该是13.但是,如果DB Connection#2将view_count视为12,则它将增加它,并且再次为13!
请记住,我只是基于尝试完全相同的UPDATE查询的多个数据库连接进行推测。
答案 1 :(得分:0)
检查view_count是否包含空值