Mysql乐观锁问题

8 篇文章 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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值