在下面的代码中,非事务性的createPerson函数调用事务性的createPersonTransaction.
IntelliJ强调了对createPersonTransactional
的调用,说这是一个事务性的self 调用,不会在运行时导致事务.
这两个函数都在从控制器调用的服务中.
当调用控制器createPerson
函数时,日志(log)显示无论如何都要创建事务.
我一直认为,像这样的函数到函数调用会命中实际的函数,而不是Spring创建的代理函数,它用transactional代码包装了函数.
那么,IntelliJ的警告是错误的吗?我肯定过go 是这样的,但现在似乎不是了.
Spring Boot 3.2.2 BTW
@Service
class PersonService(val personRepository: PersonRepository) {
fun createPerson(personRequest: PersonRequest): Person {
return createPersonTransactional(personRequest)
}
@Transactional
fun createPersonTransactional(personRequest: PersonRequest): Person {
val person = Person(name = personRequest.name)
personRepository.save(person)
return person
}
}
interface PersonRepository : JpaRepository<Person, String>
@RestController
class PersonController(
private val personService: PersonService
) {
@PostMapping("/person", produces = [MediaType.APPLICATION_XML_VALUE])
fun createPerson(@RequestBody personRequest: PersonRequest): Person {
return personService.createPerson(personRequest)
}
}
以下是显示正在进行的交易的日志(log):
2024-02-09T09:38:32.084Z DEBUG 5102 --- [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet : POST "/person", parameters={}
2024-02-09T09:38:32.084Z DEBUG 5102 --- [nio-8081-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.example.rosbug.PersonController#createPerson(PersonRequest)
2024-02-09T09:38:32.084Z DEBUG 5102 --- [nio-8081-exec-3] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-02-09T09:38:32.152Z DEBUG 5102 --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [PersonRequest(name=bert)]
2024-02-09T09:38:32.178Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(1455667122<open>)] for JPA transaction
2024-02-09T09:38:32.178Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
2024-02-09T09:38:32.182Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@65c57510]
2024-02-09T09:38:32.283Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit
2024-02-09T09:38:32.283Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(1455667122<open>)]
2024-02-09T09:38:32.305Z DEBUG 5102 --- [nio-8081-exec-3] o.s.orm.jpa.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction
2024-02-09T09:38:32.308Z DEBUG 5102 --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/xml', given [*/*] and supported [application/xml]
2024-02-09T09:38:32.320Z DEBUG 5102 --- [nio-8081-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Writing [com.example.rosbug.Person@3b4eb178]
2024-02-09T09:38:32.340Z DEBUG 5102 --- [nio-8081-exec-3] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2024-02-09T09:38:32.341Z DEBUG 5102 --- [nio-8081-exec-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK