我使用的是Spring 3.2,Hibernate和JUnit 4.
我的Dao课程如下:
@Transactional public class SomeDaoImpl implements SomeDao {
如果直接从Web应用程序执行,则对此工作进行更新操作.但是,我发现执行更新方法的junit集成测试实际上并不会保留更改.在执行junit方法时,事务是否会滚动事务?
在玩游戏时git,我有时会尝试一些东西,然后中止需要太长时间的git svn命令(例如在网络问题期间挂起的某些命令).这让我想到:
强制中止命令(Ctrl-C或kill)是否总是安全的?如果命令崩溃(内存不足,错误,网络/ FS问题)怎么办?存储库更改是"事务性的",因为不完整的更改会"回滚"(如在版本控制文件系统中)吗?或者在这种情况下我是否存在存储库损坏风险
我确信使用git的聪明人必须考虑到这一点,但我在git手册或网上找不到任何信息.
我知道当从同一个类内部调用事务方法时,它不会在事务中运行.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是事务性的,它仍然应该回滚.
我不明白为什么人们说自我调用打破了交易?只要调用方法是事务性的,不应该按预期工作吗?这里有什么我想念的吗?
配置Spring以对非回滚的一种方法RuntimeExceptions是@Transactional(rollbackFor=...)在服务类上使用注释.这种方法的问题是我们需要为几乎所有似乎真正冗余的服务类定义(rollbackFor = ...).
我的问题:有没有办法为Spring事务管理器配置默认行为,以便在非RuntimeException事件发生时回滚而不在每个@Transactional注释上声明它.类似于@ApplicationException(rollback=true)在EJB中的异常类上使用注释.
假设我有两个函数DoTaskA和DoTaskB-both能够抛出TaskException相应的"回滚"函数UndoTaskA和UndoTaskB.什么是最好的模式,以便成功或两者都失败?
我现在最好的是
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中有一些我不知道的东西,可以更好地编写代码吗?
在这里我试图删除任何包含"在他们的电子邮件/用户名中的用户.
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)
感谢你的帮助!
我在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一样.这意味着交易无法正常运作.
既createNewOne和checkIfExists有以下注释:
@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)
在日志中,事务同时提交,这意味着这些事务是正确创建的,但是并发执行会导致问题.
我有一个Node.js应用程序,它将一些配置数据存储在一个文件中.如果更改某些设置,配置文件将写入磁盘.
目前,我正在使用一个简单的fs.writeFile.
现在我的问题是:当文件被写入时Node.js崩溃会发生什么?是否有机会在磁盘上有一个损坏的文件?或者Node.js是否保证文件以原子方式写入,以便旧版本或新版本有效?
如果没有,我怎么能实现这样的保证?这有什么模块吗?
我有一个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) 我正在尝试在SQL Server 2008 R2 SP1上的Dynamics NAV数据库上设置事务复制.
使用相同的服务器,我已经能够在不同的数据库上成功设置复制.
我能够创建发布,订阅和快照,但是当我查看事件日志时,我看到以下错误:
复制 - 复制分发子系统:代理[代理名称]失败.缺少结束评论标记' /'.*
复制不起作用,并且在查询此数据库时复制监视器会有效挂起.
Google搜索返回此页面:MS Connect但我很难找到他们引用的系统生成的存储过程所在的位置.我已尝试在Profiler应用程序中使用各种过滤器搜索它,但没有太多的喜悦定位它.
任何帮助将不胜感激!
transactional ×10
spring ×5
java ×3
hibernate ×2
sql ×2
acid ×1
c++ ×1
comments ×1
crash ×1
file-io ×1
filesystems ×1
git ×1
junit4 ×1
mockito ×1
mule ×1
node.js ×1
python ×1
replication ×1
spring-test ×1
testng ×1