美文网首页
MySQL事务+FOR UPDATE解决并发操作数据库

MySQL事务+FOR UPDATE解决并发操作数据库

作者: peng_js | 来源:发表于2017-10-27 10:50 被阅读0次

    注意 FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。

    由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。

    例如下面几种情况

    A.假设有个表单products ,里面有id 跟name 二个栏位,id 是主键。

    (明确指定主键,并且有此数据,row lock也就是行锁)

    SELECT * FROM products WHERE id='3' FOR UPDATE;

    B.(明确指定主键,若查无此数据,无lock)

    SELECT * FROM products WHERE id='-1' FOR UPDATE;

    C.(无主键,table lock)

    SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

    D .(主键不明确,table lock)

    SELECT * FROM products WHERE id<>'3' FOR UPDATE;

    SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

    要测试锁定的状况,可以利用MySQL 的Command Mode ,开二个视窗来做测试

    MySQL update && select

    CREATE TABLE `testupdate` (

    `id` bigint(20) NOT NULL AUTO_INCREMENT,

    `val` bigint(20) NOT NULL DEFAULT '0',

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

    update testupdate

    set val = val+1

    where id = 1 and @value := val+1;

    select @value;

    相关文章

      网友评论

          本文标题:MySQL事务+FOR UPDATE解决并发操作数据库

          本文链接:https://www.haomeiwen.com/subject/ojdrpxtx.html