如果有人实施了交易写入文件,请帮助我.
在早期的线程(事务性写入)中讨论了相关主题.
用例如下:
如果写入日志文件失败,则应回滚适当的数据库事务.
因此,文件的写入应该以事务方式执行.
我选择了Apache Commons Transaction lib.
并且有问题,这不会让我走得更远,因为没有找到适当的文档或示例.
我创建了FileResourceManager的实例:
FileResourceManager frm = new FileResourceManager("c:\ cur","c:\ cur",true,logger);
据我从这个Apache Commons Transaction教程中了解,我应该实现以下步骤:
开始交易:
frm.start();
获取它的事务ID:
transactionId = frm.generatedUniqueTxId();
call方法,这是必需的,例如带有transactionId和resourceId的writeResource:frm.writeResource(transactionId, resourceId);
这里有歧义:
a)我如何连接resourceId真实资源,我应该交易写作?
b)我的文件如何以交易方式编写,现在将如何resourceId?
谢谢你的建议.
我有一个@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查询.但是,这不应该在当前交易中运行吗?
使用Spring + Hibernate和事务注释.
我正在尝试测试以下内容:
@Transactional服务方法来持久化它我遇到的第一个问题是在步骤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
我们有多个交易经理(WebsphereUOWTransactionManager和DatasourceTransactionManager)并使用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
我有以下代码:
/**
* 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
我们在我们的应用程序中实现了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 3和Hibernate 3.6开发Web应用程序.我对@TransactionalAnnotation和代码的结构有一些问题.
- >当我使用@Transactional(使用Spring进行事务管理)时,我是否必须@Transactional在调用它们时使用try/catch 包围注释方法?
例如,当我得到一个加载,更改并返回一个对象的方法然后我从另一个类调用它时:我是否必须使用try/catch包围调用?也许出了点问题,没有返回任何对象,数据库连接失败..我不知道.
到目前为止,我认为会@Transactional关注所有可能发生的异常,并在发生错误时回滚此事务中的每个操作.但如果它发生,我必须以某种方式通知用户.当我在try-block中调用transactional-method并回滚它时,catch块被激活了?我可以告诉用户"出了问题".否则用户可能不会被告知?
或者是否足以检查是否有返回的对象(如果/ else),那么我不需要try/catch?我是新的,我想听听其他结构如何编码.谢谢 :-)
在执行以下操作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。
这确实可以缩小问题的范围,但是为什么此时我的交易不能处于活动状态?
我正在浏览用于文件和目录管理操作的 Win32 API 函数。我看到其中一些功能有其所谓的“事务”对应项。
示例:
CreateDirectory和CreateDirectoryTransacted
RemoveDirectory和RemoveDirectoryTransacted
CreateFile和CreateFileTransacted
CopyFile和CopyFileTransacted
我阅读了这些事务函数的解释、维基百科文章Transactional NTFS和此 MSDN 杂志页面。但由于这些页面中的术语(对我来说)很重,我并没有清楚地理解这些解释。他们都达成了一个共同的共识:这些函数是“原子的”。但据我对“原子”这个词的理解,它是一个原子核,周围有旋转的电子......
您能用基本、简单的英语句子解释一下,这些函数的用途和操作是什么?人们为什么以及何时会选择 API 函数的事务版本?
我是 EJB 项目的新手。并且我试图了解在@Transactional我的 EJB 方法顶部使用注释。我搜索了内容,对此没有明确的解释。任何人都可以清楚地解释这一点。
transactional ×10
spring ×6
hibernate ×4
java ×3
ejb ×1
exception ×1
file ×1
file-io ×1
jdbctemplate ×1
jpa ×1
junit4 ×1
mybatis ×1
ntfs ×1
overriding ×1
rollback ×1
service ×1
spring-boot ×1
winapi ×1