美文网首页
Mysql乐观锁问题

Mysql乐观锁问题

作者: 躺在家里干活 | 来源:发表于2019-10-08 09:48 被阅读0次

使用乐观锁更新数据库,单元测试的时候,更新结果显示更新了一条数据,但是数据库中的update_time字段没有自动更新,这个字段设置了根据时间戳更新

遇到的问题:

Mybatis或者JOOQ执行数据库更新,返回的结果为1,但是数据库中用来作为乐观锁的update_time字段没有更新

MySQL的行为

  1. 创建数据表

创建一张user表,插入一条数据,update_time字段设置为根据时间戳更新

mysql> desc user;
+-------------+---------------------+------+-----+---------+-----------------------------+
| Field       | Type                | Null | Key | Default | Extra                       |
+-------------+---------------------+------+-----+---------+-----------------------------+
| id          | int(255)            | NO   | PRI | NULL    | auto_increment              |
| name        | varchar(10)         | NO   | MUL | NULL    |                             |
| age         | tinyint(2) unsigned | NO   |     | NULL    |                             |
| create_time | datetime            | YES  |     | NULL    |                             |
| update_time | datetime            | NO   |     | NULL    | on update CURRENT_TIMESTAMP |
+-------------+---------------------+------+-----+---------+-----------------------------+
5 rows in set (0.01 sec)

mysql> INSERT INTO `test`.`user`(`id`, `name`, `age`, `create_time`, `update_time`) VALUES (1, 'wang', 16, '2019-03-07 17:46:18', '2019-03-07 17:46:22');

  1. 更新数据
  • 没数据发生了变化
mysql> UPDATE `test`.`user`
    -> SET `name` = 'wang',
    -> `age` = 16
    -> WHERE
    -> `id` = 1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

注意这里name,age的值都没有改变,所以返回changed:0

  • 有数据发生变化
mysql> UPDATE `test`.`user`
    -> SET `name` = 'wang',
    -> `age` = 15
    -> WHERE
    -> `id` = 1;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from user;
+----+------+-----+---------------------+---------------------+
| id | name | age | create_time         | update_time         |
+----+------+-----+---------------------+---------------------+
|  1 | wang |  15 | 2019-03-07 17:46:18 | 2019-03-07 17:58:35 |
+----+------+-----+---------------------+---------------------+
1 row in set (0.00 sec)

注意这里的age发生了变化,可以看到返回了Changed:1,以及更新了update_time

问题原因

如果更新的数据没有变化,返回结果仍然是1,因为使用Mysql驱动连接数据库时,默认返回的是,匹配到的行数,并不是更新的行数。

解决方法

连接数据库时指定 useAffectedRows=true
jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useAffectedRows=true

我的个人博客,有空来坐坐

相关文章

  • Mysql乐观锁问题

    使用乐观锁更新数据库,单元测试的时候,更新结果显示更新了一条数据,但是数据库中的update_time字段没有自动...

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • MySQL悲观锁与乐观锁的实现方案

    我们知道Mysql并发事务会引起更新丢失问题,解决办法是锁,所以本文将对锁(乐观锁、悲观锁)进行分析 悲观锁和乐观...

  • 表锁和行锁

    MySQL中的锁总体可以分为悲观锁和乐观锁。悲观锁MySQL中有自带的锁。乐观锁需要自己写程序控制来实现乐观锁的功...

  • rails中乐观锁和悲观锁的使用

    MySQL乐观锁和悲观锁的介绍可以参考之前的一篇文章MySQL中的锁(行锁,表锁,乐观锁,悲观锁,共享锁,排他锁)...

  • 使用MySQL悲观锁解决电商扣库存并发问题

    昨天写了乐观锁《使用MySQL乐观锁解决电商扣库存并发问题》,有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁...

  • 乐观锁和悲观锁

    参考来源 深入理解乐观锁与悲观锁 乐观锁的一种实现方式——CAS mysql乐观锁总结和实践 乐观锁和悲观锁 悲观...

  • MYSQL 悲观锁和乐观锁

    前文我们提到了表锁,行锁的这些概念,今天我们来谈谈mysql的悲观锁和乐观锁。何为乐观锁?顾名思义,乐观锁就是乐观...

  • 分布式锁

    1,MySQL 排他锁 2,mysql 乐观锁 3,zk getchild 的 create distrutbit...

  • 蚂蚁面试

    1、mysql乐观锁和悲观锁的区别? 乐观锁通过MVCC,版本实现,悲观锁select... for update...

网友评论

      本文标题:Mysql乐观锁问题

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