标签: transactional

Spring3的@Transactional @Scheduled没有承诺DB?

这是我第一次尝试Spring3的@Scheduled,但发现我无法承诺DB.这是我的代码:

@Service
public class ServiceImpl implements Service , Serializable
{
  @Inject 
  private Dao dao;

  @Override
  @Scheduled(cron="0 0 * * * ?") 
  @Transactional(rollbackFor=Exception.class)
  public void hourly()
  {
    // get xxx from dao , modify it
    dao.update(xxx);
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为它应该工作,我可以看到它每小时启动并从DB加载xxx,但数据不会提交给DB.

有许多人tx:annotation-driven在春天的XML:

<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>

<tx:annotation-driven transaction-manager="transactionManagerApp" />
Run Code Online (Sandbox Code Playgroud)

有人能告诉我我错过了什么吗?

我有一个' '的解决方案:

@Service
public class ServiceImpl implements Service , Serializable
{
  @Inject 
  private Dao dao;

  @Inject
  @Qualifier("transactionManagerApp")
  private PlatformTransactionManager …
Run Code Online (Sandbox Code Playgroud)

spring dependency-injection scheduling transactional spring-3

8
推荐指数
2
解决办法
6908
查看次数

实体不持久 - Spring + Hibernate + JPA

我正在使用Spring + Hibernate + JPA,我遇到的情况是我无法让我的实体持久存储到数据库中.我已经设置了一个使用@Transactional注释的服务类.它使用包含注入的EntityManager的DAO.当我在服务对象上调用该函数时,我看到DAO正在执行的读取的一堆选择,但是由于我的DAO发出的合并和删除没有更新/删除.当然我的设置有问题,但我看不到它.

persistence.xml中

<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_1_0.xsd"
    version="1.0">
    <persistence-unit name="pu">
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.InformixDialect" />
            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
            <property name="hibernate.showsql" value="true" />
            <property name="hibernate.cache.use_second_level_cache"
                value="false" />
        </properties>
    </persistence-unit>
Run Code Online (Sandbox Code Playgroud)

config.xml中

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                http://www.springframework.org/schema/security
                http://www.springframework.org/schema/security/spring-security-3.0.3.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/testdb" />  
        <property name="username" value="username" />
        <property name="password" value="password" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="pu" />
        <property …
Run Code Online (Sandbox Code Playgroud)

spring hibernate transactions transactional entitymanager

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

关于Grails服务的一些问题

我正在使用Grails Web应用程序,在使用Grails服务时我遇到了很多奇怪的事情.所以我想就此问一些问题,让我更多地了解Grails服务.这对我来说非常有用(也许对其他人来说^ _ ^).提前致谢.

  1. 如果服务配置为static transactional = true,那么在使用脏对象并在Hibernate会话中被锁定的任何方法调用后,它是否会刷新对DB的每个数据更改?

  2. 我可以@Transactional在课程级别使用注释而不是static transactional = true吗?是否有可能将@Transactional(readOnly = true)某些方法放在我希望它们从DB读取(查询,查找)数据?

  3. 事务继承怎么样?我的意思是,如果配置了父服务static transactional = true,并且子服务有它自己的@Transactional注释(在类上)和一些@Transactional(readOnly = true)(在某些方法上),如果我从子节点调用父节点的方法会发生什么?

  4. 事务是否适用于抽象服务?因为我知道,使用抽象服务我们无法初始化它的bean,也许在启动应用程序时,Grails上下文中存在一些差异.

service grails spring transactions transactional

8
推荐指数
1
解决办法
1582
查看次数

事务性注释避免了被模拟的服务

我有一个drools规则文件,它使用规则中的服务类.所以一条规则做了这样的事情:

eval(countryService.getCountryById(1)!= null)

在使用@service和@Transactional(propagation = Propagation.SUPPORTS)注释的验证服务中,drools文件用于statelessKnowledgebase,并添加应在流氓中使用的事实.完成后,调用session.execute(fact)并启动规则引擎.

为了测试规则,我想将countryService.getCountryById()存根.使用mockito没什么大问题.对于使用drools设置的其他服务也做了这个,它工作正常.然而,在这种特殊情况下,countryService没有存根,我无法弄清楚原因.花了很多时间并检查我的代码后,我发现在服务之上使用@Transactional或缺少这个注释会产生差异.缺少@Transaction使mockito模拟了countryservice没有任何问题,让@transactional到位导致mockito失败(没有任何错误或提示)注入模拟以便使用原始的countryservice对象.

我的问题是为什么这个注释会导致这个问题.为什么在设置@Transactional时无法模拟注入模拟?我注意到mockito失败了,因为我在调试和检查countryService时将它作为全局添加到drools会话中当我在debugwindow中检查countryservice时,我看到以下区别:

  • 与@transactional:countryService的值为CountryService $$ EnhancerByCGLIB $$ b80dbb7b

  • 没有@transactional:countryService的值为CountryService $$ EnhancerByMockitoWithCGLIB $$ 27f34dc1

除了@transactional之外,我在乡村服务方法中发现断点getCountryById并且调试器在该断点处停止,但是没有@transactional我的断点被跳过,因为mockito会绕过它.

ValidationService:

@Service
@Transactional(propagation=Propagation.SUPPORTS)
public class ValidationService 
{
  @Autowired
  private CountryService countryService;

  public void validateFields(Collection<Object> facts)
  {
    KnowledgeBase knowledgeBase = (KnowledgeBase)AppContext.getApplicationContext().getBean(knowledgeBaseName); 
    StatelessKnowledgeSession session = knowledgeBase.newStatelessKnowledgeSession();
    session.setGlobal("countryService", countryService);
    session.execute(facts);

  }
Run Code Online (Sandbox Code Playgroud)

和测试类:

public class TestForeignAddressPostalCode extends BaseTestDomainIntegration
{

  private final Collection<Object> postalCodeMinLength0 = new ArrayList<Object>();

  @Mock
  protected CountryService countryService;

  @InjectMocks
  private ValidationService level2ValidationService;


  @BeforeMethod(alwaysRun=true)
  protected void setup()
  {
    // Get the object under test …
Run Code Online (Sandbox Code Playgroud)

testng spring transactional mockito

8
推荐指数
3
解决办法
6089
查看次数

SQL Server 2008事务复制'缺少结束注释标记'*/''

我正在尝试在SQL Server 2008 R2 SP1上的Dynamics NAV数据库上设置事务复制.

使用相同的服务器,我已经能够在不同的数据库上成功设置复制.

我能够创建发布,订阅和快照,但是当我查看事件日志时,我看到以下错误:

复制 - 复制分发子系统:代理[代理名称]失败.缺少结束评论标记' /'.*

复制不起作用,并且在查询此数据库时复制监视器会有效挂起.

Google搜索返回此页面:MS Connect但我很难找到他们引用的系统生成的存储过程所在的位置.我已尝试在Profiler应用程序中使用各种过滤器搜索它,但没有太多的喜悦定位它.

任何帮助将不胜感激!

sql replication comments transactional sql-server-2008-r2

8
推荐指数
1
解决办法
1370
查看次数

Hibernate无法为远程服务器上的当前线程获取事务同步的Session

我在类似问题上阅读了其他答案,但我找不到解决问题的方法.我有一个Tomcat7服务器和一个Spring应用程序,它使用Hibernate连接到我的PostgreSQL远程数据库.我的框架版本是:Spring框架4.2.2 Spring安全3.2.5 Hibernate 4.3.6

当我在localhost上运行我的应用程序时一切都很好,但是当我在服务器上部署它时,我在登录时收到此错误:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
    org.myapp.spring.dao.generic.GenericDAOImpl.getSession(GenericDAOImpl.java:59)
    org.myapp.spring.dao.impl.DeveloperDaoImpl.findByUsername(DeveloperDaoImpl.java:51)
    org.myapp.spring.service.impl.DeveloperServiceImpl.findByUsername(DeveloperServiceImpl.java:149)
    org.myapp.spring.web.security.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:23)
    org.myapp.spring.web.security.MyAuthenticationProvider.authenticate(MyAuthenticationProvider.java:30)
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:167)
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192)
    org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:93)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
Run Code Online (Sandbox Code Playgroud)

我有两个inizializer文件:

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        Class[] config = {AppConfig.class};
        return config;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        Class[] config = {SecurityConfig.class, HibernateConfig.class};
        return config;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] …
Run Code Online (Sandbox Code Playgroud)

postgresql spring hibernate spring-mvc transactional

8
推荐指数
1
解决办法
1088
查看次数

Apache Transaction:以事务方式写入文件 - 如何使用resourceId

如果有人实施了交易写入文件,请帮助我.
在早期的线程(事务性写入)中讨论了相关主题.

用例如下:
如果写入日志文件失败,则应回滚适当的数据库事务.

因此,文件的写入应该以事务方式执行.

我选择了Apache Commons Transaction lib.
并且有问题,这不会让我走得更远,因为没有找到适当的文档或示例.

我创建了FileResourceManager的实例:

FileResourceManager frm = new FileResourceManager("c:\ cur","c:\ cur",true,logger);

据我从这个Apache Commons Transaction教程中了解,我应该实现以下步骤:

  1. 开始交易:
    frm.start();

  2. 获取它的事务ID:
    transactionId = frm.generatedUniqueTxId();

  3. call方法,这是必需的,例如带有transactionId和resourceId的writeResource:
    frm.writeResource(transactionId, resourceId);

这里有歧义:
a)我如何连接resourceId真实资源,我应该交易写作?
b)我的文件如何以交易方式编写,现在将如何resourceId

谢谢你的建议.

java file transactional apache-commons

7
推荐指数
1
解决办法
3600
查看次数

Spring嵌套了@Transactional方法和回滚

我有一个@Service类,它有一个@Transactional方法,可以在同一个类上调用另一个@Transactional方法.我正在为此测试回滚行为,我发现它无法正常工作.代码看起来像这样:

@Service
public class DefaulService implements ervice
{
    @Transactional
    public void methodOne()
    {
        methodTwo();

            //question edited
            //this seems to be the problem
            this.serviceDAO.executeUpdateOperation();

        //test rollback
        throw new RuntimeException();
    }

    @Transactional
    public void methodTwo()
    {
        //DAO stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

运行methodOne之后,我检查数据库并且存在更改,即使日志显示"JDBCTransaction - rollback".

如果我单独调用methodTwo并在其末尾添加异常,则会正确回滚更改.

有没有办法让methodOne正确回滚在嵌套的@Transactional调用期间发生的更改?我的印象是REQUIRED的默认传播会实现这一点,但它似乎没有起作用.谢谢

UPDATE

好的,我刚注意到别的东西.在异常抛出之前,我正在调用服务的dao并通过'executeUpdate'执行手动更新.如果我对此行进行注释,则嵌套回滚会起作用.所以似乎问题实际上是调用DAO并运行executeUpdate查询.但是,这不应该在当前交易中运行吗?

service spring hibernate transactional rollback

7
推荐指数
1
解决办法
3965
查看次数

如何测试Spring @Transactional而不仅仅是打击hibernate 1级缓存或进行手动会话刷新?

使用Spring + Hibernate和事务注释.

我正在尝试测试以下内容:

  1. 调用一个方法来更改User对象,然后调用一个@Transactional服务方法来持久化它
  2. 从数据库中读取对象并确保在方法之后它的值是正确的

我遇到的第一个问题是在步骤2中读取User对象,只返回Hibernate 1级缓存中的那个,并且实际上没有从数据库中读取.

因此,我使用Session手动从缓存中驱逐对象以强制从数据库读取.但是,当我这样做时,对象值永远不会在单元测试中持久存在(我知道在测试完成后它会因为我指定的设置而回滚).

我尝试在调用@Transactionalservice方法后手动刷新会话,并且DID提交更改.但是,这不是我的预期.我认为@Transactional服务方法可以确保事务已提交并且会话在返回之前刷新.我知道Spring一般会决定何时进行这种管理,但我认为方法中的"工作单元" @Transactional就是这种方法.

无论如何,现在我想弄清楚我将如何测试@Transactional一般的方法.

这是一个失败的junit测试方法:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@TransactionConfiguration(transactionManager = "userTransactionManager", defaultRollback = true)
@WebAppConfiguration()
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml",
        "classpath:test-spring-servlet.xml",
        "classpath:test-applicationContext-security.xml" })
public class HibernateTest {

    @Autowired
    @Qualifier("userSessionFactory")
    private SessionFactory sessionFactory;

    @Autowired
    private UserService userService;

    @Autowired
    private PaymentService paymentService;

    @Autowired
    private QueryService queryService;

    @Autowired
    private NodeService nodeService;

    @Autowired
    private UserUtils userUtils;

    @Autowired
    private UserContext userContext;

  @Test
    public void testTransactions() {
        // read the user …
Run Code Online (Sandbox Code Playgroud)

spring hibernate sessionfactory transactional transactionmanager

7
推荐指数
1
解决办法
6247
查看次数

非法尝试登记多个1PC XAResources

我们有多个交易经理(WebsphereUOWTransactionManagerDatasourceTransactionManager)并使用Mybatis和NamedParameterJdbcTemplate(遗留代码)

用于工作的代码和所做的更改将转移@Transactional到服务级别并sqlsession.commit从mybatis代码中删除.

但是现在存在JdbcTemplate执行遗留代码()的问题.

错误是

20170427 19:22:02.045 [SimpleThreadPoolWorker-2] DEBUG o.s.b.c.r.d.JdbcStepExecutionDao # Truncating long message before update of StepExecution, original message is: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [
                UPDATE JOB_RUN
                SET SYS_RUN_STUS_CD = ?,
                UPDT_USER_ID = 'SYSTEM',
                REC_UPDT_TS = CURRENT_TIMESTAMP
                WHERE  JOB_RUN_ID = ?
            ]; SQL state [null]; error code [0]; enlist: caught Exception; nested exception is java.sql.SQLException: enlist: caught Exception
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:660) …
Run Code Online (Sandbox Code Playgroud)

spring transactional jdbctemplate spring-transactions mybatis

7
推荐指数
0
解决办法
1020
查看次数