只是一点背景,我是一个新的开发人员,最近在高级开发人员离开公司之后接手了一个重大项目,然后我才完全了解他是如何构建这个项目的。我会尽力解释我的问题。
此应用程序创建多个 MessageListner 线程以从 JMS 队列读取对象。接收到对象后,数据将根据某些业务逻辑进行操作,然后映射到持久性对象以使用休眠 EntityManager 保存到 oracle 数据库中。
直到几周前,自从我加入这个项目以来,这个配置在过去一年左右的时间里还没有出现任何重大问题。但是对于其中一个队列(问题与此特定队列隔离),处理接收到的对象的 spring 托管 bean 挂在下面的方法中。我的调试使我得出结论,它已完成方法中的所有内容,但在完成时挂起。经过数周的尝试解决这个问题,我对这个问题束手无策。对此的任何帮助将不胜感激。
由于每个 MessageListner 都有自己的处理器,因此这种挂起方法只影响一个队列上的传入数据。
@Transactional(propagation = Propagation.REQUIRES_NEW , timeout = 180)
public void update(UserRelatedData userData, User user,Company company,...)
{
...
....
//business logic performed on user object
....
......
entityMgr.persist(user);
//business logic performed on userData object
...
....
entityMgr.persist(userData);
...
....
entityMgr.flush();
}
Run Code Online (Sandbox Code Playgroud)
我插入调试语句只是为了遍历该方法,它完成了包括 entityMgr.flush.() 在内的所有内容。
我现在知道 Spring-Batch 中没有步骤间事务性这样的东西。我正在开发一个复杂的批处理作业,其中有许多步骤在数据库中执行多个操作,并且每个步骤都与其他步骤相关,这样每个步骤都属于同一个事务。我理解 Spring-Batch 范式的方式我必须使用一步工作来实现事务性。是否有任何想法(或任何其他方式)在最近或未来的版本中具有某种工作级别的事务性?
Edit1:我在这个链接6.3.1 点中找到了一种连接多个处理器的方法,但这不能满足我当前的需求。
Edit2:this other link建议我使用带有“@Transactional”注释的信封类的可能性,该类将调用我的工作,因此应该有一个外部事务。
我正在尝试为 Rest API 实现注册控制器。我已经阅读了很多关于放置@Transactional 的内容。(不是在 DAO 级别,而是在可能编排的服务)。在我的用例中,我不仅需要服务,还需要休眠验证来使用相同的事务。
这是控制器的代码:
@Autowired
private UserService userService;
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
@Transactional
public DefaultResponse register(@Valid RegisterIO registerIO, BindingResult errors) {
DefaultResponse result = new DefaultResponse();
if (errors.hasErrors()) {
result.addErrors(errors);
} else {
userService.register(registerIO);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我编写了一个自定义约束注释,它验证参数 registerIO 的属性。两者,这个验证器和 userService.register(registerIO); 访问数据库(检查电子邮件地址是否已被使用)。
因此我希望这两种方法都使用相同的 Hibernate 会话和事务。
这种方法导致以下异常:
org.hibernate.HibernateException: No Session found for current thread
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:941)
Run Code Online (Sandbox Code Playgroud)
问题是@Transactional 注释。当我将此注释放在调用数据库的方法上时,一切正常,但两个事务都开始了。我怀疑当我将它放在 register 方法中时,在 @Transactional 启动此方法的事务之前执行休眠验证。
我开发了以下功能解决方法,但我对此并不满意。此代码不使用 @Valid 注释而是自行调用验证器:
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
@Transactional
public DefaultResponse register( RegisterIO registerIO, BindingResult …Run Code Online (Sandbox Code Playgroud) java spring-mvc transactional hibernate-validator hibernate-4.x
一切都在标题中......
我有一个JpaRepository<User, Long>使用其他自定义方法扩展的存储库,遵循http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html 中描述的模式
Spring 文档说:默认情况下,存储库实例上的 CRUD 方法是事务性的。对于读取操作,事务配置 readOnly 标志设置为 true,所有其他操作都使用普通的 @Transactional 进行配置。
先感谢您!
我需要在正在进行的事务中启动新事务,以便第二个事务中的异常只会回滚新事务而不是旧事务。
这是我通过在第二个事务中设置传播属性来做的,如下所示:
@Transactional(传播 = 传播.REQUIRES_NEW)
这创建了一个新事务,但新事务需要读取第一个事务的一些未提交数据(脏读),并更新该数据。我试图通过将隔离属性设置为:
@Transactional(propagation = Propagation.REQUIRES_NEW,isolation=Isolation.READ_UNCOMMITTED)
这将引发异常 - InvalidIsolationLevelException,表示“标准 JPA 不支持自定义隔离级别 - 为您的 JPA 实现使用特殊的 JpaDialect”。
任何人都可以帮助我实施 JpaDialect 吗?我正在使用 Eclipse Link 2.5.1 。
或者我可以在开始新交易之前如何关闭第一笔交易?由于第一个事务已关闭,因此第二个事务读取第一个事务提交的数据没有问题。
jpa transactional eclipselink transaction-isolation read-uncommitted
我有一个带有调用另一种方法的方法的服务。在第一种方法中,我只使用 SELECT 执行查询,但他们必须查看在第二种方法中完成的 INSERTS 和 UPDATES。
然后,我必须处理交易。我正在使用 Spring,所以我可以使用 @Transactional 注释。
以下哪个选项似乎更适合您?
选项 A
@Transactional
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
Run Code Online (Sandbox Code Playgroud)
选项 B
public void generate(){
// selects
save(a);
// more selects
}
@Transactional
public void save(Object a){
//save the object
}
Run Code Online (Sandbox Code Playgroud)
谢谢!!
我试图@Transactional在我的服务的方法中使用注释来懒洋洋地加载一个字段.但是,@Transactional在我的Implementation类上使用会生成所有自动装配的字段null.
这是我的实现:
@Service
public class UserServiceImpl implements UserService {
/**
* DefaultMapper.
*/
@Autowired
private DefaultMapper defaultMapper;
/**
* Resource service injection.
*/
@Autowired
private ResourceService resourceService;
/**
* UserRepository.
*/
@Autowired
private UserRepository userRepository;
/**
* Jwt Factory.
*/
@Autowired
private JwtService jwtService;
@Override
@Transactional
public final UserDto findByLogin(final String login) throws ResourceNotFoundException {
// user repository is null here when using @Transactional
User user = this.userRepository.findByLogin(login)
.orElseThrow(() -> new ResourceNotFoundException(
resourceService.getMessage(MessageBundle.EXCEPTION, "resource.notfound.user.login") …Run Code Online (Sandbox Code Playgroud) 我对@Transactional 注释在业务/服务层的使用有点不清楚。
我的问题是,当在业务层中与ISOLATION_SERIALIZABLE一起使用时,@Transactional注解是否保证不允许对特定方法进行并发访问?
@Transactional(isolation = Isolation.SERIALIZABLE)
public void businessMethod() {
// calls subBusinessMethod
subBusinessMethod();
---------------
---------------
---------------
}
Run Code Online (Sandbox Code Playgroud)
想象一下subBusinessMethod调用 DAO 层来做一些数据库事务。调用之后的代码执行(可能会有更多的 db 调用)subBusinessMethod取决于subBusinessMethod.
我需要确保对 的后续调用businessMethod不应该调用 dao 层从/向数据库读/写,而不知道先前调用的 db 表发生了什么。已在业务逻辑中添加了必需的验证。
首先,我的方法有效吗?如果是这样,我是否以正确的方式使用它。?
我正在尝试使用 Springs @Retryable 使我的服务方法在失败时重试。
@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
//some logic and saving
}
Run Code Online (Sandbox Code Playgroud)
问题是,在保存某物对象后出现异常。所以事务被回滚并再次调用方法。不同之处在于,something-object 的 id 不再是 null,而是它从 Hibernate 之前的保存过程中获得的值,因此在第二次尝试中,Hibernate 不会保存该对象,而是尝试更新它。由于数据库中没有条目,因此更新不执行任何操作,并且对象不会持久保存到数据库中。
认识到这一点后,我尝试将 @Retryable 的 stateful 属性设置为 true:
@Retryable(backoff = @Backoff(delay = 1000), maxAttempts = 3, stateful = true)
@Transactional(rollbackFor = Throwable.class)
public Something saveSomething(Something something) {
//some logic and saving
}
Run Code Online (Sandbox Code Playgroud)
但是使用该配置 saveSomething() 只调用一次,而 der 不是第二次尝试。
有没有人建议解决这个问题?
我正在做一个春季启动项目。
在@Transactional项目中使用注释之前,我有两个问题
@Transactional在spring-boot,服务层或DAO层中使用注释的最佳实践?
如果是服务层,那么我应该@Transactional在类或该类中的方法上使用注释?
transactional ×10
java ×6
spring ×6
jpa ×3
hibernate ×2
spring-boot ×2
annotations ×1
autowired ×1
database ×1
eclipselink ×1
propagation ×1
repository ×1
spring-batch ×1
spring-mvc ×1
spring-retry ×1
transactions ×1