标签: transactional

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
查看次数

为什么用@Transactional 注释的方法必须是可覆盖的

我有以下代码:

/**
 * Restored deleted partner
 */
@Transactional
public void restorePartnerById(Integer id){
    // logic      
}
Run Code Online (Sandbox Code Playgroud)

当我使方法最终

/**
 * Restored deleted partner
 */
@Transactional
public final void restorePartnerById(Integer id){
    // logic      
}
Run Code Online (Sandbox Code Playgroud)

我收到一个编译错误,说明:

注释的方法@Transactional必须是可覆盖的

我四处寻找,但我无法理解为什么它必须能够覆盖,为什么该方法必须能够覆盖?

java overriding transactional spring-transactions spring-boot

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

junit测试用例事务没有被提交 - 没有错误

我们在我们的应用程序中实现了JUnit4,它使用Spring核心和JPA与DB2.我们需要测试一个完整的功能,它从一个数据库中检索数据并合并到另一个数据库中.

编写用于从第一个数据库检索数据的测试用例,它正在运行而没有任何错误,但是记录没有存储到第二个数据库中.

履行

我们在TestCase类中包含了以下注释,以便在必要时使测试用例在事务下运行,

@RunWith(SpringJUnit4ClassRunner.class)
@TestExecutionListeners({
      DependencyInjectionTestExecutionListener.class,    
      TransactionalTestExecutionListener.class})
@ContextConfiguration(locations={""})
@TransactionConfiguration(transactionManager="defaultTransactionManager", defaultRollback=false)
@Transactional
Run Code Online (Sandbox Code Playgroud)

在应用程序中,我们有一个manager类来使用doSynch()方法执行此操作.从该方法开始,将调用crudHelper类的txStore()方法来初始化并调用doStore()方法(在同一个类中)以将实体合并到数据库.

以下是整个测试用例逻辑的事务声明

TestCase testSynch() - @Transactional(propagation=Propagation.SUPPORTS)
Manager doSynch() - @Transactional(propagation=Propagation.NEVER)
CRUDHelper txStore() - @Transactional(propagation=Propagation.REQUIRED)
           doStore() - No Transactional annotation
Run Code Online (Sandbox Code Playgroud)

doSynch()被标记为NEVER,因为此时它不需要任何事务,并且在诸如CRUDHelper之类的更高级别中,事务可以被标记为REQUIRED以确保事务可用.

问题

这里,当我们运行调用Manager的doSynch()方法来测试功能的测试用例时,完整的流程工作正常,除了记录没有合并并且没有抛出错误.

从JSP调用时,Manager方法非常有效.我们还通过直接从测试用例调用txStore()进行测试,它也可以正常工作.

请告知我们交易管理是否不正确,或者解决这个问题会有更大的帮助.如果问题或环境不明确,请更新我.提前致谢.!!

spring jpa transactional junit4

6
推荐指数
1
解决办法
8768
查看次数

Hibernate,Spring,@ Transactional - 用try/catch包围?

我正致力于使用Spring 3和Hibernate 3.6开发Web应用程序.我对@TransactionalAnnotation和代码的结构有一些问题.

- >当我使用@Transactional(使用Spring进行事务管理)时,我是否必须@Transactional在调用它们时使用try/catch 包围注释方法?

例如,当我得到一个加载,更改并返回一个对象的方法然后我从另一个类调用它时:我是否必须使用try/catch包围调用?也许出了点问题,没有返回任何对象,数据库连接失败..我不知道.

到目前为止,我认为会@Transactional关注所有可能发生的异常,并在发生错误时回滚此事务中的每个操作.但如果它发生,我必须以某种方式通知用户.当我在try-block中调用transactional-method并回滚它时,catch块被激活了?我可以告诉用户"出了问题".否则用户可能不会被告知?

或者是否足以检查是否有返回的对象(如果/ else),那么我不需要try/catch?我是新的,我想听听其他结构如何编码.谢谢 :-)

java spring hibernate exception transactional

6
推荐指数
1
解决办法
8083
查看次数

@Transactional方法中的LazyInitializationException

在执行以下操作org.hibernate.LazyInitializationException时,当我尝试访问延迟加载的异常时遇到错误:

@Transactional
public void displayAddresses()
{
     Person person = getPersonByID(1234);
     List<Address> addresses = person.getAddresses(); // Exception Thrown Here

     for(Address address : addresses)
          System.out.println(address.getFullAddress());
}
Run Code Online (Sandbox Code Playgroud)

我的实体看起来像这样:

@Entity
@Table("PERSON_TBL")
public class Person
{
     ...

     @OneToMany(cascade=CascadeType.ALL, targetEntity=Address.class, mappedBy="person")
     private List<Address> addresses;

     ...
}

@Entity
@Table("ADDRESS_TBL")
public class Address
{
     ...

     @ManyToOne(targetEntity=Person.class)
     @JoinColumn(name="PERSON_ID", referencedColumnName="PERSON_ID")
     Person person;

     ...
}
Run Code Online (Sandbox Code Playgroud)

我的印象是,通过在我的displayAddresses()方法中使用@Transactional批注,它将使会话保持活动状态,直到该方法完成为止,从而使我可以访问延迟加载的Address集合。

我想念什么吗?

编辑

按照Tomasz的建议:在我的displayAddresses()方法中,状态TransactionSynchronizationManager.isActualTransactionActive(),变为false

这确实可以缩小问题的范围,但是为什么此时我的交易不能处于活动状态?

spring hibernate transactional

6
推荐指数
2
解决办法
4072
查看次数

什么是“事务性”文件操作?

我正在浏览用于文件和目录管理操作的 Win32 API 函数。我看到其中一些功能有其所谓的“事务”对应项。

示例:
CreateDirectoryCreateDirectoryTransacted
RemoveDirectoryRemoveDirectoryTransacted
CreateFileCreateFileTransacted
CopyFileCopyFileTransacted

我阅读了这些事务函数​​的解释、维基百科文章Transactional NTFS此 MSDN 杂志页面。但由于这些页面中的术语(对我来说)很重,我并没有清楚地理解这些解释。他们都达成了一个共同的共识:这些函数是“原子的”。但据我对“原子”这个词的理解,它是一个原子核,周围有旋转的电子......

您能用基本、简单的英语句子解释一下,这些函数的用途和操作是什么?人们为什么以及何时会选择 API 函数的事务版本?

file-io winapi ntfs transactional windows-vista

6
推荐指数
2
解决办法
4983
查看次数

@Transactional注解有什么用

我是 EJB 项目的新手。并且我试图了解在@Transactional我的 EJB 方法顶部使用注释。我搜索了内容,对此没有明确的解释。任何人都可以清楚地解释这一点。

ejb transactional

6
推荐指数
1
解决办法
7201
查看次数