标签: transactional

Spring @Transactional在JUnit测试中不起作用?

我使用的是Spring 3.2,Hibernate和JUnit 4.

我的Dao课程如下:

@Transactional public class SomeDaoImpl implements SomeDao {

如果直接从Web应用程序执行,则对此工作进行更新操作.但是,我发现执行更新方法的junit集成测试实际上并不会保留更改.在执行junit方法时,事务是否会滚动事务?

spring hibernate transactional spring-test junit4

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

如果修改它的命令崩溃或被中止,git存储库是否会被破坏?

在玩游戏时git,我有时会尝试一些东西,然后中止需要太长时间的git svn命令(例如在网络问题期间挂起的某些命令).这让我想到:

强制中止命令(Ctrl-C或kill)是否总是安全的?如果命令崩溃(内存不足,错误,网络/ FS问题)怎么办?存储库更改是"事务性的",因为不完整的更改会"回滚"(如在版本控制文件系统中)吗?或者在这种情况下我是否存在存储库损坏风险

我确信使用git的聪明人必须考虑到这一点,但我在git手册或网上找不到任何信息.

git crash transactional

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

Spring @Transactional Annotation:自我调用

我知道当从同一个类内部调用事务方法时,它不会在事务中运行.Spring为事务方法创建一个代理,并将它们包装在try-catch块中,并在发生异常时回滚.请考虑以下情形:

@Transactional
public void saveAB(A a, B b)
{
    saveA(a);
    saveB(b);
}

@Transactional
public void saveA(A a)
{
    dao.saveA(a);
}

@Transactional
public void saveB(B b)
{
    dao.saveB(b);
}
Run Code Online (Sandbox Code Playgroud)

假设从另一个对象调用saveAB并在saveB中发生异常,因此saveA成功完成但saveB没有成功.据我所知,即使saveA和saveB不是事务性的(因为它们是从同一个对象调用的),因为saveAB是事务性的,它仍然应该回滚.

我不明白为什么人们说自我调用打破了交易?只要调用方法是事务性的,不应该按预期工作吗?这里有什么我想念的吗?

java spring hibernate transactional self-invoking-function

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

Spring:对已检查的异常进行自动回滚

配置Spring以对非回滚的一种方法RuntimeExceptions@Transactional(rollbackFor=...)在服务类上使用注释.这种方法的问题是我们需要为几乎所有似乎真正冗余的服务类定义(rollbackFor = ...).


我的问题:有没有办法为Spring事务管理器配置默认行为,以便在非RuntimeException事件发生时回滚而不在每个@Transactional注释上声明它.类似于@ApplicationException(rollback=true)在EJB中的异常类上使用注释.

java spring transactional

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

C++类似事务的模式,适用于所有或没有任何工作

假设我有两个函数DoTaskADoTaskB-both能够抛出TaskException相应的"回滚"函数UndoTaskAUndoTaskB.什么是最好的模式,以便成功或两者都失败?

我现在最好的是

bool is_task_a_done = false,
     is_task_b_done = false;

try {
    DoTaskA();
    is_task_a_done = true;

    DoTaskB();
    is_task_b_done = true;
} catch (TaskException &e) {
    // Before rethrowing, undo any partial work.
    if (is_task_b_done) {
        UndoTaskB();
    }
    if (is_task_a_done) {
        UndoTaskA();
    }
    throw;
}
Run Code Online (Sandbox Code Playgroud)

我知道这is_task_b_done是不必要的,但是如果我们稍后添加第三个或第四个任务,则可能显示代码对称性.

由于辅助布尔变量,不喜欢这段代码.也许新的C++ 11中有一些我不知道的东西,可以更好地编写代码吗?

c++ design-patterns transactional

10
推荐指数
2
解决办法
7357
查看次数

python mysql删除语句不起作用

在这里我试图删除任何包含"在他们的电子邮件/用户名中的用户.

    def removeQuote(self, tbl,record):
            """ Updates the record """
            statmt="select id from %s WHERE `email` LIKE '%%\"%%'" % (tbl)
            self.cursor.execute(statmt)
            rows=list(self.cursor.fetchall())
            for idx, val in enumerate(rows):
                    id= val[0]
                    delstatmt = "DELETE FROM `maillist_subscription` WHERE id = '%s'" % id
                    print delstatmt
                    self.cursor.execute(delstatmt)
Run Code Online (Sandbox Code Playgroud)

此输出显示操作已成功完成,但记录仍保留在数据库中.输出还显示了正确的mysql语句:

DELETE FROM `maillist_subscription` WHERE id = '8288754'
Run Code Online (Sandbox Code Playgroud)

感谢你的帮助!

python sql transactional

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

Mule/Spring事务不会传播

我在mule flow中遇到数据库事务的问题.这是我定义的流程:

<flow name="createPortinCaseServiceFlow">
    <vm:inbound-endpoint path="createPortinCase" exchange-pattern="request-response">
        <custom-transaction action="ALWAYS_BEGIN" factory-ref="muleTransactionFactory"/>
    </vm:inbound-endpoint>

    <component>
        <spring-object bean="checkIfExists"/>
    </component>
    <component>
        <spring-object bean="createNewOne"/>
    </component>

</flow>
Run Code Online (Sandbox Code Playgroud)

我们的想法是,在checkIfExists中,我们验证是否存在某些数据(在数据库中)是否存在异常.如果不是,我们去createNewOne并创建一个新数据.

问题

如果我们同时运行流程,则会在createNewOne中多次创建新对象,并且它们不应该像我们之前调用checkIfExists一样.这意味着交易无法正常运作.

更多信息:

createNewOnecheckIfExists有以下注释:

@Transactional(propagation = Propagation.MANDATORY)
Run Code Online (Sandbox Code Playgroud)

muleTransactionFactory的定义如下所示

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="dataSource" ref="teleportNpDataSource"/>
    <property name="entityManagerFactory" ref="npEntityManagerFactory"/>
    <property name="nestedTransactionAllowed" value="true"/>
    <property name="defaultTimeout" value="${teleport.np.tm.transactionTimeout}"/>
</bean>

<bean id="muleTransactionFactory" class="org.mule.module.spring.transaction.SpringTransactionFactory">
    <property name="manager" ref="transactionManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

我已经设置了TRACE日志级别(如@Shailendra建议的那样),我发现事务在所有spring bean中都被重用:

00:26:32.751 [pool-75-thread-1] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Participating in existing transaction
Run Code Online (Sandbox Code Playgroud)

在日志中,事务同时提交,这意味着这些事务是正确创建的,但是并发执行会导致问题.

java spring transactional mule spring-transactions

10
推荐指数
1
解决办法
283
查看次数

以事务方式在Node.js中写入文件

我有一个Node.js应用程序,它将一些配置数据存储在一个文件中.如果更改某些设置,配置文件将写入磁盘.

目前,我正在使用一个简单的fs.writeFile.

现在我的问题是:当文件被写入时Node.js崩溃会发生什么?是否有机会在磁盘上有一个损坏的文件?或者Node.js是否保证文件以原子方式写入,以便旧版本或新版本有效?

如果没有,我怎么能实现这样的保证?这有什么模块吗?

filesystems file-io acid transactional node.js

9
推荐指数
3
解决办法
3518
查看次数

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

我有一个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
查看次数