有人可以通过现实世界的例子解释注释中的隔离和传播参数@Transactional.基本上何时以及为什么我应该选择更改其默认值.
我想知道当你用方法注释方法时实际发生了@Transactional什么?当然,我知道Spring会将该方法包装在Transaction中.
但是,我有以下疑问:
注意:由于此机制基于代理,因此只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法被标记,也不会在运行时导致实际的事务
@Transactional!
资料来源:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html
为什么只有外部方法调用才会在Transaction下而不是自调用方法?
我为spring配置了事务支持.有没有办法记录事务只是为了确保我正确设置所有内容?在日志中显示是查看正在发生的事情的好方法.
我在Service类中看到了一个被标记为的方法@Transactional,但它也在同一个类中调用了一些未标记为的其他方法@Transactional.
这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或挂起父事务等?
没有任何注释的方法的默认行为是什么,由另一个带@Transactional注释的方法调用?
关于这个主题已经有一些问题,但是没有任何响应可以提供参数来解释为什么我们不应该创建一个Spring MVC控制器Transactional.看到:
所以为什么?
背景:几年前,我在团队中使用C#/ NHibernate/Spring.Net实现了一个相当大的ERP软件.对服务器的往返实际上是这样实现的:事务在进入任何控制器逻辑之前打开,并在退出控制器后被提交或回滚.该交易在框架中进行管理,因此没有人必须关心它.这是一个出色的解决方案:稳定,简单,只有少数架构师不得不关心交易问题,团队的其他成员只是实现了功能.
从我的角度来看,这是我见过的最好的设计.当我尝试使用Spring MVC重现相同的设计时,我进入了一个带有延迟加载和事务问题的噩梦,每次都有相同的答案:不要让控制器进行事务处理,但为什么呢?
提前感谢您的答案!
我有一个使用@Transactional注释的方法.我从Oracle DB中检索一个对象,更改一个字段,然后从该方法返回.我忘了保存对象,但发现无论如何都要更新数据库.
的applicationContext
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
我的方法
@Transactional
public void myMethod(long id) {
MyObject myObj = dao.getMstAttributeById(id);
myObj.setName("new name");
//dao.update(myObj);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么MyObject被持久化到数据库?
我有一个方法如下:
ClassA.java
@Transactional
public void methodA(){
ExecutorService executorService = Executors.newFixedThreadPool(4);
executorService.execute(new Runnable() {
public void run() {
classB.methodB();
}
});
}
ClassB.java
@Transactional
public void methodB(){
updateDB();
}
Run Code Online (Sandbox Code Playgroud)
方法B可以很好地工作吗?根据我的理解,methodB将附加methodA的事务,如果methodA在methodB之前退出怎么办?我想只有methodA才能被事务提交.但是因为之前提交的事务,methodB不会提交.
我可以对methodB使用@Transactional(propagation = Propagation.REQUIRES_NEW).这可以让方法B有一个新的事务.但是根据spring doc,方法A的转换将在调用methodB时暂停.我觉得这里很困惑.
任何人都可以帮我解决这个问题吗?提前致谢.
我之前有一个关于这个问题的帖子已经解决了.但是,自从使用自动连线bean和较少的XML配置重建项目后,我发现我正在重新审视此问题.我已按照我之前的项目实施此方式的方式,但它不起作用.有人可以帮助我解决为什么或我应该改变什么来使它工作?
我故意在插入用户详细信息方法中使用不存在的表名来故意抛出异常.但是,不会回滚插入用户和插入用户角色的语句.请帮忙.
我目前的注册设计是这样的.
部分servlet.xml中:
<context:component-scan base-package="com.doyleisgod.golfer.controllers"/>
<context:component-scan base-package="com.doyleisgod.golfer.dao"/>
<context:component-scan base-package="com.doyleisgod.golfer.services"/>
<context:component-scan base-package="com.doyleisgod.golfer.validators"/>
Run Code Online (Sandbox Code Playgroud)
部分应用程序上下文:
<context:annotation-config />
<tx:annotation-driven />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
注册控制器:
package com.doyleisgod.golfer.controllers;
import javax.validation.Valid;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.doyleisgod.golfer.formdata.RegistrationForm;
import com.doyleisgod.golfer.services.IRegistrationService;
import com.doyleisgod.golfer.validators.RegistrationFormValidator;
/**
* …Run Code Online (Sandbox Code Playgroud) Spring文档在描述事务传播属性方面做得非常出色.
但是,我想知道是否有任何众所周知的现实世界的例子可以用外行的方式更全面地描述这些属性?
是否有可能在春季嵌套@Transactional注释方法?考虑这样的事情:
@Transactional
public void a() {
obj.b();
}
@Transactional
public void b() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果我在b()中回滚并在()中回滚,会发生什么情况?
transactional ×10
spring ×9
java ×8
propagation ×3
hibernate ×2
spring-mvc ×2
annotations ×1
controller ×1
isolation ×1
java-ee ×1
spring-aop ×1
spring-jdbc ×1
transactions ×1