面试题答案
一键面试声明式事务管理
- 配置依赖:在
build.gradle.kts
中确保有Spring Boot事务相关依赖:
dependencies {
implementation("org.springframework.boot:spring-boot-starter - transaction")
}
- 启用事务管理:在Spring Boot主应用类上添加
@EnableTransactionManagement
注解:
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.transaction.annotation.EnableTransactionManagement
@SpringBootApplication
@EnableTransactionManagement
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}
- 使用声明式事务:在Service方法上添加
@Transactional
注解:
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
class UserService {
@Transactional
fun saveUser(user: User) {
// 保存用户逻辑
}
}
优点:
- 代码侵入性低,业务逻辑与事务管理分离,提高代码可读性和可维护性。
- 配置简单,只需在方法或类上添加注解即可。
缺点:
- 灵活性相对较低,对于复杂的事务控制场景可能无法满足需求。
适用场景:适用于大多数常规业务场景,事务边界清晰,对事务控制要求不复杂的情况。
编程式事务管理
- 注入事务管理器:
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.jdbc.datasource.DataSourceTransactionManager
import org.springframework.stereotype.Service
import org.springframework.transaction.TransactionDefinition
import org.springframework.transaction.TransactionStatus
import org.springframework.transaction.support.DefaultTransactionDefinition
@Service
class UserService {
@Autowired
private lateinit var transactionManager: DataSourceTransactionManager
fun saveUser(user: User) {
val def = DefaultTransactionDefinition()
def.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRED
val status: TransactionStatus = transactionManager.getTransaction(def)
try {
// 业务逻辑
transactionManager.commit(status)
} catch (e: Exception) {
transactionManager.rollback(status)
throw e
}
}
}
优点:
- 高度灵活,可以在代码中根据业务逻辑精确控制事务的开始、提交和回滚。
缺点:
- 代码侵入性高,业务逻辑与事务管理代码紧密耦合,降低代码可读性和维护性。
- 编写复杂,需要手动处理事务的各个环节。
适用场景:适用于复杂的事务控制场景,如多个不同数据源的事务处理,或者需要根据业务逻辑动态决定事务边界的情况。