我正在使用 Mysql 和 Grails。
假设我有一个实体类Book,bookmysql 中的表有一auto_incremented id列。
说下面是我的服务方法:
@Transactional
public void someMethod() {
Book book = new Book("Book Name", "Author Name") // book.id is null here
book.save();
println book.id // id is initialized
}
当我使用调试器停止println语句时,我看到book' 的id属性已初始化。由于我对 db 没有flushing任何意义,因此该行尚未插入到 db 中,因此id在插入时不会生成,而是以其他方式生成。一种可能的id初始化方式似乎是当在实体上执行auto_increment该方法时,休眠运行一个查询只是为了获取下一个值save()(不确定是否是这种情况)。如果是这种情况,那么 2 个并发事务获得相同的 ID 呢?