使用乐观锁更新数据库,单元测试的时候,更新结果显示更新了一条数据,但是数据库中的
update_time
字段没有自动更新,这个字段设置了根据时间戳更新
遇到的问题:
Mybatis或者JOOQ执行数据库更新,返回的结果为
1
,但是数据库中用来作为乐观锁的update_time
字段没有更新
MySQL的行为
- 创建数据表
创建一张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');
- 更新数据
- 没数据发生了变化
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
网友评论