我有一个如下代码
public abstract class AffltTransactionService implements IAffltTransactionService {
....
@Override
@Transactional
public void processTransactions(List<? extends AffltTransaction> transactions) {
for (AffltTransaction transaction : transactions) {
if (transaction != null) {
processTransaction(transaction);
}
}
}
private void processTransaction(AffltTransaction transaction) {
try {
processTransactionInternal(transaction);
} catch (Exception exception) {
affltTransactionError = new AffltTransactionError(null, null, "error", new Date());
saveAffltTransactionError(affltTransactionError);
log.error(exception.getLocalizedMessage());
}
}
@Transactional(readOnly=false, rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public void processTransactionInternal(AffltTransaction transaction) {
Run Code Online (Sandbox Code Playgroud)
processTransactionInternal抛出ServiceUnAvailableException,它扩展了RuntimeException
但是,尽管有rollbackFor = Exception.class,事务仍未回滚.你能帮忙吗?
当我从另一个事务方法调用一个事务方法,现在我的第二个事务方法完成,又回到第一个事务方法时,会发生什么,不幸的是它失败了,所以它将回滚所有内容,这意味着它将回滚第二个事务方法的更改.. ?? 注意:两种方法都在同一个类中
@Transactional
public void method1(){
//do something
call method2();
//do something
...
...
failed here
}
@Transactional
public void method2(){
//do something
save()
}
Run Code Online (Sandbox Code Playgroud)
因此,在上面的示例中,它会回滚我在第二个事务处理方法中保存的内容吗?
当内部方法分别是事务性的时,我想在服务层测试非事务性方法。我想知道如果某个方法抛出异常会发生什么。它是否正确回滚?我也尝试过rollbackFor,但没有帮助。有什么建议么?
应用程序属性
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop
server.error.include-message=always
server.error.include-binding-errors=always
Run Code Online (Sandbox Code Playgroud)
控制器
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=create-drop
server.error.include-message=always
server.error.include-binding-errors=always
Run Code Online (Sandbox Code Playgroud)
服务
@PostMapping("/test")
public void test(){
service.test();
}
Run Code Online (Sandbox Code Playgroud) 我有以下案例:
如何做到这一点?我不想在步骤 5 期间锁定表。步骤 1-4 的行为应类似于“SELECT FOR UPDATE”。下面是我当前的代码。我正在执行的方法是execute()。我通过从不同的应用程序实例执行它来测试它,并检查实例 A 是否能够在实例 B 执行executeJob(job)时对表执行操作。
@Service
@Slf4j
@Transactional
public class JobExecutionService {
private final Environment environment;
private final TestJobRepository testJobRepository;
private final TestJobResultRepository testJobResultRepository;
@Autowired
public JobExecutionService(Environment environment, TestJobRepository testJobRepository, TestJobResultRepository testJobResultRepository) {
this.environment = environment;
this.testJobRepository = testJobRepository;
this.testJobResultRepository = testJobResultRepository;
}
public void execute() {
TestJob job = getJob();
executeJob(job);
finishJob(job);
}
@Transactional
public TestJob getJob() {
TestJob testJob …Run Code Online (Sandbox Code Playgroud)