标签: transactions

仅标记为回滚的事务:如何查找原因

我在@Transactional方法中提交事务时遇到问题:

methodA() {
    methodB()
}

@Transactional
methodB() {
    ...
    em.persist();
    ...
    em.flush();
    log("OK");
}
Run Code Online (Sandbox Code Playgroud)

当我从methodA()调用methodB()时,该方法成功通过,我可以在日志中看到"OK".但后来我明白了

Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at methodA()...
Run Code Online (Sandbox Code Playgroud)
  1. 方法B的上下文在异常中完全丢失 - 我想这没关系?
  2. methodB()中的某些内容将事务标记为仅回滚?我怎么能找到它?例如,有一种方法来检查类似的东西getCurrentTransaction().isRollbackOnly()?- 像这样我可以逐步完成方法并找到原因.

java spring hibernate jpa transactions

83
推荐指数
7
解决办法
21万
查看次数

82
推荐指数
2
解决办法
4万
查看次数

Android数据库事务

我创建了一个数据库.我想做交易.SaveCustomer()包含多个语句,以便Customer, CustomerControl, Profile, Payment在那时将记录插入表中.

当用户调用 SaveCustomer()方法时,该数据将转到这4个表.所以我该如何进行交易?如果一个表插入失败,则需要回滚所有内容.例如,当第3个表插入记录时出现错误,那么还需要回滚前两个表的插入记录.

看我的代码:

public void saveCustomer(){
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(RetailerOrderKeyActivity.this);
    dbAdapter.openDataBase();
    ContentValues initialValues = new ContentValues();
    initialValues.put("CustomerName",customer.getName());
    initialValues.put("Address",customer.getAddress());
    initialValues.put("CustomerPID",strPID);
    initialValues.put("Date",strDateOnly);
    long n = dbAdapter.insertRecordsInDB("Customer", null, initialValues);

}
Run Code Online (Sandbox Code Playgroud)

同样其他声明也在那里.

DBAdpter代码是:

public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
    long n =-1;
    try {
        myDataBase.beginTransaction();
        n = myDataBase.insert(tableName, nullColumnHack, initialValues);

        myDataBase.endTransaction();
        myDataBase.setTransactionSuccessful();
    } catch (Exception e) {
        // how to do the rollback 
        e.printStackTrace();
    }

    return n;
}
Run Code Online (Sandbox Code Playgroud)

这是完整的代码:

public class DBAdapter extends …
Run Code Online (Sandbox Code Playgroud)

sqlite android transactions

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

如果发生错误,using语句是否会回滚数据库事务?

我在using语句中有一个IDbTransaction,但我不确定如果在using语句中抛出异常,它是否会被回滚.我知道using语句会强制调用Dispose()......但是有人知道Rollback()是否也是如此?

更新:此外,我是否需要显式调用Commit(),如下所示,还是由using语句处理吗?

我的代码看起来像这样:

using Microsoft.Practices.EnterpriseLibrary.Data;

...

using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();

    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# transactions using-statement rollback

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

Django:我如何防止数据库条目的并发修改

如果有办法防止两个或多个用户同时修改同一数据库条目?

向执行第二次提交/保存操作的用户显示错误消息是可以接受的,但不应以静默方式覆盖数据.

我认为锁定条目不是一个选项,因为用户可能会使用"后退"按钮或只是关闭他的浏览器,永远保持锁定.

django concurrency transactions atomic django-models

77
推荐指数
5
解决办法
4万
查看次数

"@Transactional"应放在哪里放置服务层或DAO

首先,我可能会问一些之前被问过和回答的问题,但我无法获得搜索结果.好的一般(或总是到目前为止:))我们通常在服务层上定义事务注释典型的spring hibernate crud

控制器 - >经理 - >道 - >奥姆.

我现在有一种情况需要在基于客户端站点的域模型之间进行选择.假设客户端A使用我的域模型一切都很好但是其他客户端站点会给我一个Web服务而不是使用我们的域模型.

我应该替换哪一层.我相信它必须是Dao,它将从Web服务中获取数据并将其发送回来.两个单独编写的Dao图层并根据场景插入.

我现在已经意识到,当我们在服务层中放置@Transactional时,我们一直在进行紧耦合(如果有这样的事情或说没有松耦合).这么多大脑不会错,或者是他们(我对此表示怀疑).

所以问题是"应该在哪里"@Transactional"放置服务层或DAO?" 是服务层向下我应该更换.

spring dao transactions

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

Database.BeginTransaction vs Transactions.TransactionScope

System.Transactions.TransactionScope和EF6有什么区别Database.BeginTransaction

有人可以给出一个小例子,或者只是解释哪一个有明显区别?

PS:在我的项目中,我使用的是EF6.我已经阅读了文档,但它没有多大帮助.还查看了这些示例,但它们正在使用SqlConnection.BeginTransaction,现在MS已经Database.BeginTransaction在EF6中引入了这个新功能.

c# entity-framework transactions transactionscope entity-framework-6

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

即使使用事务回滚,SQL标识(自动编号)也会增加

我有一个.net事务与SQL插入到SQL Server 2005数据库.该表具有标识主键.

当事务中发生错误时,将Rollback()被调用.行插入正确回滚,但是下次将数据插入表时,标识会增加,就好像回滚从未发生过一样.所以基本上在身份序列中存在差距.有没有办法让Rollback()方法回收丢失的身份?

我没有以正确的方式接近这个吗?

.net sql transactions sql-server-2005 identity-column

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

在LINQ to SQL中的TransactionScope与事务

LINQ to SQL中的经典事务模式有什么区别:

using(var context = Domain.Instance.GetContext())
{
    try
    {
        context.Connection.Open();
        context.Transaction = context.Connection.BeginTransaction();
        /*code*/
        context.Transaction.Commit();
    }
    catch
    {
        context.Transaction.Rollback();
    }         
}
Run Code Online (Sandbox Code Playgroud)

vs TransactionScope对象

using (var context = Domain.Instance.GetContext())
using (var scope = new TransactionScope())
{
    try
    {
        /*code*/
        scope.Complete();
    }
    catch
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

c# linq transactions linq-to-sql

76
推荐指数
4
解决办法
6万
查看次数

实体框架6事务回滚

使用EF6,您可以使用以下新事务:

using (var context = new PostEntityContainer())
        {
            using (var dbcxtransaction = context.Database.BeginTransaction())
            {
                try
                {
                    PostInformation NewPost = new PostInformation()
                    {
                        PostId = 101,
                        Content = "This is my first Post related to Entity Model",
                        Title = "Transaction in EF 6 beta"
                    };
                    context.Post_Details.Add(NewPost);
                    context.SaveChanges();
                    PostAdditionalInformation PostInformation = new PostAdditionalInformation()
                    {
                        PostId = (101),
                        PostName = "Working With Transaction in Entity Model 6 Beta Version"
                    };

                    context.PostAddtional_Details.Add(PostInformation);
                    context.SaveChanges();

                    dbcxtransaction.Commit();
                }
                catch
                {
                    dbcxtransaction.Rollback();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

当事情横盘整理时,实际上需要回滚吗?我很好奇,因为提交描述说:"提交基础商店交易."

而回滚描述说:"回滚基础商店交易."

这让我感到很好奇,因为在我看来,如果没有调用Commit,先前执行的命令将不会被存储(这对我来说似乎是合乎逻辑的).但如果是这种情况,那么调用Rollback函数的原因是什么?在EF5中我使用了TransactionScope,它没有回滚功能(只有一个完整的),这对我来说似乎是合乎逻辑的.由于MS …

c# sql-server entity-framework transactions entity-framework-6

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