【发布时间】:2018-03-28 22:32:08
【问题描述】:
传播设置是必需的。
@Transactional(propagation = Propagation.REQUIRED)
事务是读/写的。
在哪些场景中使用它们?请给我举例说明
【问题讨论】:
标签: spring jpa transactions spring-transactions
传播设置是必需的。
@Transactional(propagation = Propagation.REQUIRED)
事务是读/写的。
在哪些场景中使用它们?请给我举例说明
【问题讨论】:
标签: spring jpa transactions spring-transactions
Spring事务默认是
@Transactional(propagation = Propagation.REQUIRED)
所以你不需要指定传播属性。
那么,@Transactional 对 spring 组件的注解是什么意思?
Spring 框架将启动一个新事务并执行所有方法并最终提交该事务。
但如果application context中不存在事务,那么spring容器将启动一个新事务。
Propagation.REQUIRED,则事务行为在逻辑上以嵌套方式分配给每个方法,但它们都在同一个物理事务下。那么,结果如何?
结果是如果任何嵌套事务失败,则整个事务将失败并回滚(不要在 db 中插入任何值)而不是提交。
例子:
@Service
public class ServiceA{
@Transactional(propagation = Propagation.REQUIRED)
public void foo(){
fooB();
}
@Transactional(propagation = Propagation.REQUIRED)
public void fooB(){
//some operation
}
}
说明:
在这个例子中,foo() 方法分配了一个事务行为,在 foo() 内部调用了另一个方法 fooB(),它也是事务性的。
这里fooB() 就foo() 而言充当嵌套事务。如果fooB() 因任何原因失败,那么foo() 也无法提交。而是回滚。
【讨论】:
这个注解只是为了帮助 Spring 框架管理你的数据库事务。
假设您有一个写入数据库的服务 bean,并且您希望确保写入是在事务中完成然后您使用
@Transactional(propagation = Propagation.REQUIRED)
这是一个 Spring 服务 bean 的小例子。
@Service
class MyService {
@Transactional(propagation = Propagation.REQUIRED)
public void writeStuff() {
// write something to your database
}
}
Transactional 注释告诉 Spring:
【讨论】: