数据库使用的是pgsql,编程语言使用的是java,伪代码如下:
@Transactional
public void testTimeInTransactional() {
A a = new A();
a.setUpdateTime(new Date());
//执行更新表a 的sql,更新时间取的是java方法里的new Date()
// update table_a set updateTime = #{a.updateTime}
//执行更新表b和表c的sql,更新时间取的是sql函数 now()
// update table_b set update_time = now();
// update table_c set update_time = now();
// 其他业务逻辑
// ....
}
发现以下现象:
table_b 和table_c 的update_time时间一样,但却小于table_a的update_time。
经查询资料,找到以下知识点:
(1)在一个事务中,PostgreSQL的now()函数返回的是事务开始时间。 在事务开始时调用now()函数,它会返回事务开始时的当前时间。即使在事务过程中多次调用now()函数,每次调用返回的时间都是事务开始时的同一时间;
(2)在Java中,new Date()创建的是一个代表当前日期和时间的对象,精度为毫秒。数据库中的now()函数提供的时间通常包含微秒级别的精度。