【发布时间】:2015-11-22 06:54:36
【问题描述】:
我正在使用 play 框架开发一个 Web 应用程序,该应用程序使用 JOOQ 和 spring 事务访问 postgres 数据库。
目前我正在实施按以下方式构建的用户注册:
-
用户发布注册表单
-
请求被路由到一个控制器操作,该操作将所有参数(如电子邮件、密码等)映射到 DTO 上。 DTO 的不同字段使用 JSR 303 约束进行注释。
电子邮件字段使用约束验证器进行注释,以确保不会添加两次相同的地址。这个验证器有一个对
UserRepository的自动引用,因此它可以调用它的isExistingEmail方法。 -
调用用户服务的注册方法,基本如下:
@Transactional(isolation = Isolation.SERIALIZABLE) public User signupUser(UserDto userDto) { validator.validate(userDto); userRepository.add(userDto); return tutor; }
如果出现验证错误,服务内部的validator.validate(userDto) 调用将引发 RuntimeException。
请注意,存储库的add 方法带有@Transactional(propagation = Propagation.MANDATORY) 注释,而isExistingEmail 方法没有任何注释。
我的问题是,当我连续两次发布注册表单时,我从数据库收到一个唯一约束错误,因为两次userRepository.isExistingEmail 调用都返回 false。但是,我希望第二个注册调用不允许将用户添加到存储库,因为我将事务的隔离级别设置为可序列化。
这是预期的行为还是可能存在 JOOQ/spring 事务配置问题?
我在服务中添加了TransactionSynchronizationManager.isActualTransactionActive() 调用,以确保事务实际处于活动状态。所以这部分似乎有效。
【问题讨论】:
标签: spring postgresql transactions bean-validation jooq