标签: spring-transactions

如何以编程方式配置TransactionManager

我在这里有一个基于Spring MVC的应用程序.我的同事(顺便说一句,他不在这里)以编程方式配置它,除了TransactionManager之外,一切似乎都有效.我从未配置过像这样的Spring Web应用程序,我也不知道该做什么,也找不到任何关于如何配置这样的web应用程序的文档.

我只会告诉你'AppInitializer'和'EntityManagerConfig'.

AppInitializer:

public class AppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    AnnotationConfigWebApplicationContext context;
    ServletRegistration.Dynamic dispatcherServletRegistration;
    FilterRegistration.Dynamic encodingFilterRegistration, compressionFilterRegistration;
    Set<SessionTrackingMode> sessionTrackingModes = new HashSet<SessionTrackingMode>();

    sessionTrackingModes.add(SessionTrackingMode.SSL);

    context = new AnnotationConfigWebApplicationContext();
    context.setServletContext(servletContext);
    context.scan("de.devbliss.doc");

    servletContext.addListener(new ContextLoaderListener(context));
    servletContext.addListener(new Log4jConfigListener());

    dispatcherServletRegistration = servletContext.addServlet("main", new DispatcherServlet(context));
    dispatcherServletRegistration.setLoadOnStartup(1);
    dispatcherServletRegistration.addMapping("/*");

    encodingFilterRegistration = servletContext.addFilter("encodingFilter", CharacterEncodingFilter.class);
    encodingFilterRegistration.setInitParameter("encoding", "UTF-8");
    encodingFilterRegistration.setInitParameter("forceEncoding", "true");
    encodingFilterRegistration.addMappingForUrlPatterns(null, false, "/*");

    compressionFilterRegistration = servletContext.addFilter("compressionFilter", GzipFilter.class);
    compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");

    compressionFilterRegistration = servletContext.addFilter("springSecurityFilterChain",
            DelegatingFilterProxy.class);
    compressionFilterRegistration.addMappingForUrlPatterns(null, false, "/*");

    servletContext.setSessionTrackingModes(sessionTrackingModes);
}
}
Run Code Online (Sandbox Code Playgroud)

EntityManagerConfig:

@Configuration
@PropertySource("classpath:/db.properties") …
Run Code Online (Sandbox Code Playgroud)

java hibernate spring-mvc spring-transactions

12
推荐指数
1
解决办法
1万
查看次数

Spring Global事务与本地事务

阅读Spring事务文档时,我发现它支持全局事务和本地事务.

  • 简单来说,什么是全局事务,什么是本地事务?
  • 一个优于另一个的优点是什么?它们的适当用途是什么?

如果我使用以下配置 - 它是否意味着它是本地事务?

<tx:annotation-driven transaction-manager="transManager" />

<bean id="transManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
</bean>
Run Code Online (Sandbox Code Playgroud)

我尝试在Google和Stackoverflow中搜索,但没有得到任何资源解释相同的简单术语.

java spring transactions distributed-transactions spring-transactions

12
推荐指数
1
解决办法
1万
查看次数

JtaTransactionManager和ChainedTransactionManager之间的区别?

我需要管理我的应用程序中的多个资源,如jms数据库

在查看可以管理多个资源的事务管理器时,我遇到了两个事务管理器JtaTransactionManagerChainedTransactionManager,它们几乎声称可以管理多个资源.

任何人都可以解释它们的主要区别吗?什么时候应该使用哪一个?

java spring transactions spring-transactions

12
推荐指数
1
解决办法
1626
查看次数

升级Spring依赖项后获取错误A JTA EntityManager无法使用getTransaction()

我正在使用我的项目<version.org.aspecj>1.7.4</version.org.aspecj><vesrion.org.springframework>4.0.1.RELEASE</vesrion.org.springframework>版本.最近我将这两个版本升级到 <version.org.aspectj>1.8.9</version.org.aspectj><version.org.springframework>4.3.11.RELEASE</version.org.springframework>.

我在我的项目中使用JPA存储库,当我尝试保存任何对象时,我收到的错误如"JTA EntityManager无法使用getTransaction()".

下面是我的persistence.xml和其他配置.请求您查看这些配置并分享您的输入.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="appPersistenceUnit"
                      transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/appDS</jta-data-source>
        <!-- entities -->
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
        <properties>
            <property name="jboss.entity.manager.factory.jndi.name"
                      value="persistence-units/fusePersistenceUnit"/>
            <property name="hibernate.transaction.jta.platform"
                      value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
            <property name="hibernate.connection.autocommit" value="false"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/>
            <property name="hibernate.current_session_context_class"
                      value="jta"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.generate_statistics" value="false"/>
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.jdbc.batch_size" value="40"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.cache.use_query_cache" value="true"/>
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
                        <property name="hibernate.search.default.directory_provider" value="filesystem" />

            <property name="hibernate.connection.url" …
Run Code Online (Sandbox Code Playgroud)

java hibernate jta spring-transactions spring-data

12
推荐指数
1
解决办法
376
查看次数

跨两个数据源的事务管理(ChainedTransactionManager)-SpringBoot

为什么 SpringChainedTransactionManager被弃用了?Spring 是否提供任何替代库来支持多个事务管理器?

我的用例:- 我们正在构建一个连接到两个数据源(db1 和 db2)的 Spring Boot 应用程序,它对两个数据库(db1 和 db2)执行插入操作。我们的要求是这样的:插入 -> DB1 -> 成功插入 -> DB2 -> 错误回滚 DB1

目前,我们正在使用ChaninedTransactionManager并且它按预期工作,但我可以看到 lib 已被弃用。那么,只是想确保使用它是否安全,或者 Spring 是否提供了任何我们可以用来替代它的替代库?

spring spring-transactions spring-data spring-boot

12
推荐指数
2
解决办法
2万
查看次数

旧的"@Transactional来自同一班级"的情况

原始问题的概要:使用带有AOP代理的标准Spring事务,不可能从同一类中的非@Transactional-marked方法调用@ Transactional-marked方法并且在事务内(特别是由于前面提到的)代理).据说在AspectJ模式下使用Spring Transactions可以实现这一点,但它是如何完成的?

编辑:使用加载时编织的AspectJ模式中Spring事务的完整纲要:

将以下内容添加到META-INF/spring/applicationContext.xml:

<tx:annotation-driven mode="aspectj" />

<context:load-time-weaver />
Run Code Online (Sandbox Code Playgroud)

(我假设您已经在应用程序上下文中设置了一个AnnotationSessionFactoryBean和一个HibernateTransactionManager设置.您可以将标签添加transaction-manager="transactionManager"为属性<tx:annotation-driven />,但如果事务管理器bean的id属性值实际上是" transactionManager",则它是多余的,因为" transactionManager"是该属性的默认值.)

添加META-INF/aop.xml.内容如下:

<aspectj>
  <aspects>
    <aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect" />
  </aspects>
  <weaver>
    <include within="my.package..*" /><!--Whatever your package space is.-->
  </weaver>
</aspectj>
Run Code Online (Sandbox Code Playgroud)

添加aspectjweaver-1.7.0.jarspring-aspects-3.1.2.RELEASE.jar你的classpath.我使用Maven作为我的构建工具,所以这里是<dependency />项目POM.xml文件的声明:

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.7.0</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

spring-instrument-3.1.2.RELEASE.jar不需要作为<dependency />你的classpath,但你仍然需要它在 …

java aop spring-aop spring-transactions

11
推荐指数
1
解决办法
3932
查看次数

带有@Transactional注释的Spring OpenSessionInViewFilter

这是关于Spring 在服务层OpenSessionInViewFilter使用 @Transactional注释.

我经历了这么多的堆栈溢出帖子,但仍然困惑我是否应该使用OpenSessionInViewFilter或不避免LazyInitializationException 如果有人帮我找到以下查询的答案将是很大的帮助.

  • OpenSessionInViewFilter在具有复杂模式的应用程序中使用是不好的做法.
  • 使用此过滤器可能会导致N+1问题
  • 如果我们使用OpenSessionInViewFilter它是否意味着@Transactional不需要?

下面是我的Spring配置文件

<context:component-scan base-package="com.test"/>
<context:annotation-config/>
 <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="resources/messages" />
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
 <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="/WEB-INF/jdbc.properties" />
 <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />
       <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />     
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
                <!--
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                 -->
            </props>
        </property>
    </bean> …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-transactions

11
推荐指数
2
解决办法
9931
查看次数

hibernate session.flush with spring @transactional

我在我的应用程序中使用spring和hibernate并使用spring事务.

所以我在方法和带有数据库查询方法的DAO层上有注释@transaction的服务层.

@Transactional(readOnly = false)
public void get(){

}
Run Code Online (Sandbox Code Playgroud)

问题是当我想在数据库中保存一个对象时,我必须@Transaction在DAO层方法结束时使用.为什么?

我想如果我有注释@ transaction,那么spring应该在完成服务方法时自动提交事务.

DAO层:

public BaseEntity saveEntity(BaseEntity entity) throws Exception {
        try {
            Session session = sessionFactory.getCurrentSession();
            session.saveOrUpdate(entity);
            session.flush();
        } catch (HibernateException he) {
            throw new Exception("Failed to save entity " + entity);
        }
        return entity;
    }
Run Code Online (Sandbox Code Playgroud)

服务层:

    @Transactional(readOnly = false)
    public BaseEntity saveEntity(BaseEntity entity) throws Exception {
        return dao.saveEntity(entity);
    }
Run Code Online (Sandbox Code Playgroud)

弹簧配置:

<context:property-placeholder properties-ref="deployProperties" />

    <tx:annotation-driven transaction-manager="transactionManager" />   

    <!-- Activate Spring Data JPA repository support -->
    <jpa:repositories base-package="com" /> …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate spring-transactions

11
推荐指数
1
解决办法
2万
查看次数

我们是否需要在 Spring 中同时使用 @Transactional 和 @Modifying 注解?

我仍然试图围绕@Transactional 的工作原理进行思考。

@Transactional对 Service 类的方法进行了@Modifying注释,对 Repository 类中的方法进行了注释。带@Transactional注释的方法是否适用于带注释的 Repository 中的方法@Modifying

我的理解:

@Transactional@Transactional( readOnly = true )没有数据的类的方法上写入数据库,而在使用 时@Transactional,数据写入数据库。

修改查询

  1. 修改方法签名只能返回voidInteger或者int
  2. 更新查询必须是事务性的,标记为 @Transactional
  3. Spring Data 将删除所有未刷新的更改EntityManager,更改为@Modifying(clearAutomatically=false)

正如第二点所说的@Modifying查询必须有@Transactional(readOnly=false),所以我们可以在@Service方法调用@Repository级别或方法级别调用中添加它。如果在@Service级别添加它也适用于@Respository@Service级别方法调用中调用的方法?

例子:

@Service
class AnimalServiceImpl implements AnimalService {

@Autowire
AnimalRepository animalRepository;

@Override
@Transactional
public void persistAnimal() {
....
animalRepository.save();
}

@Override
@Transactional(readOnly …
Run Code Online (Sandbox Code Playgroud)

java spring transactions spring-transactions

11
推荐指数
1
解决办法
1万
查看次数

在不增加执行时间的情况下多次调用返回DeferredResults的异步服务

我的应用程序应该有2个核心端点:push,pull for sending和fetching data.

拉操作应该异步工作并产生DeferredResult.当用户通过休息调用pull service时,会创建新的DefferedResult并将其存储到Map<Long, DefferedResult> results = new ConcurrentHashMap<>()等待新数据的位置或直到超时到期.

推送操作也会呼叫用户过度休息,此操作会检查此操作所推送的数据接收者的结果映射.当map包含收件人的结果时,这些数据被设置为他的结果,返回DefferedResult.

这是基本代码:

@Service
public class FooServiceImpl {
    Map<Long, DefferedResult> results = new ConcurrentHashMap<>();

    @Transactional
    @Override
    public DeferredResult<String> pull(Long userId) {
        // here is database call, String data = fooRepository.getNewData(); where I check if there are some new data in database, and if there are, just return it, if not add deferred result into collection to wait for it
        DeferredResult<String> newResult = new DeferredResult<>(5000L);
        results.putIfAbsent(userId, …
Run Code Online (Sandbox Code Playgroud)

java spring spring-transactions spring-boot spring-async

11
推荐指数
1
解决办法
2078
查看次数