Vis*_*ish 8 java spring transactions spring-aop
我正在使用基于注释的声明方法来实现spring aop.示例代码
ClassA{
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
add()
{
method1();
method2();
method3();
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然怀疑使用传播.传播.Requires_New意味着每个请求都将启动新事务.
第二个问题:
是不是像method2,method3这样的方法失败会导致事务回滚?
如果有任何可以帮助我倾斜交易传播,我将非常高兴.
有人可以为我提供一个真实世界的例子,我们需要参与现有的交易.因为我想象我们在上面的例子中使用的添加功能将对所有用户独立,或者任何其他功能将独立于每个正在呼叫的用户.我无法找到使用PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等其他传播行为的示例
Sea*_*oyd 36
回答这个评论,而不是实际的问题:
交易是特定于会话或特定于请求 - 3小时前
都不是.请求和会话都是特定于Web的范围,而Spring Transaction抽象与Web技术无关.
@Transactional每个方法调用的范围,@Transactional通过Spring AOP实现.事务状态保存在ThreadLocal变量中,这些变量在输入最外层@Transactional方法时初始化,并在保留时通过提交或回滚清除.这整个抽象适用于Java方法级别,因此不需要Web容器或从Web容器中获利.
并在以下评论中回答此问题:
谢谢@sean,我仍然无法得到答案,其中使用了PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW等其他传播行为.请参阅上面的整个问题
这是Propagation我的评论值列表:
强制
支持当前事务,如果不存在则抛出异常.
不启动新事务,只检查事务是否处于活动状态(必须在另一个@Transactional方法调用或以编程方式创建的事务中)
NESTED
如果存在当前事务,则在嵌套事务中执行,其行为与PROPAGATION_REQUIREDelse 类似 .
如果事务存在,则启动嵌套事务,否则启动新事务.
永远
不以事务方式执行,如果事务存在则抛出异常.
不开始交易.如果存在交易,则会失败.
NOT_SUPPORTED
非事务性执行,暂停当前事务(如果存在).
不开始交易.暂停任何现有交易.
必需
支持当前事务,如果不存在则创建新事务.
如果存在事务,则使用该事务,否则创建一个新事务.在95%的情况下,这就是您所需要的.
REQUIRES_NEW
创建一个新事务,暂停当前事务(如果存在).
无论是否存在现有交易,始终都会创建新交易.如果有,它将在此方法执行期间暂停.
支持支持当前事务,如果不存在则以非事务方式执行.
可以使用一个事务,但不需要一个事务(也不会启动一个事务)
在大多数情况下,REQUIRED您需要的是(因此它是@Transactional注释中的默认值).我个人从来没有见过任何其他值,但REQUIRED与REQUIRES_NEW使用.
| 归档时间: |
|
| 查看次数: |
24192 次 |
| 最近记录: |