美文网首页
MYSQL开发过程中JDBC返回影响行数错误

MYSQL开发过程中JDBC返回影响行数错误

作者: 躺在家里干活 | 来源:发表于2019-10-08 09:47 被阅读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开发过程中JDBC返回影响行数错误

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