当前位置: 首页 > 面试题库 >

SQL事务如何工作?

乐正迪
2023-03-14
问题内容

我从事SQL的时间不长,但是我想我知道,通过将SQL语句包装在事务中可以完成所有语句,或者没有一个完成。这是我的问题。我有一个具有lineitem集合的订单对象。订单项与order.OrderId相关。我已经验证
所有ID都已设置并且正确, 但是当我尝试保存(插入)订单时,我得到 的INSERT语句与FOREIGN KEY约束“FK_OrderItemDetail_Order”冲突。 在数据库“ MyData”的表“ dbo.Order”的列“ OrderId”中发生了冲突。

psuedo code:

create a transaction
transaction.Begin()
Insert order
Insert order.LineItems <-- error occurs here
transaction.Commit

actual code:

...
entity.Validate();
if (entity.IsValid)
{
    SetChangedProperties(entity);
    entity.Install.NagsInstallHours = entity.TotalNagsHours;
    foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection)
    {
        SetChangedOrderItemDetailProperties(orderItemDetail);
    }
    ValidateRequiredProperties(entity);
    TransactionManager transactionManager = DataRepository.Provider.CreateTransaction();
    EntityState originalEntityState = entity.EntityState;
    try
    {
        entity.OrderVehicle.OrderId = entity.OrderId;
        entity.Install.OrderId = entity.OrderId;
        transactionManager.BeginTransaction();

        SaveInsuranceInformation(transactionManager, entity);
        DataRepository.OrderProvider.Save(transactionManager, entity);
        DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection);             if (!entity.OrderVehicle.IsEmpty)
        {
            DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle);
        }
        transactionManager.Commit();
    }
    catch
    {
        if (transactionManager.IsOpen)
        {
            transactionManager.Rollback();
        }
        entity.EntityState = originalEntityState;
    }
}
...

有人建议我需要使用两项交易,一项用于订单,一项用于订单项,但我可以肯定地说这是错误的。但是我已经为此奋斗了整整一天,我需要解决它,这样我就可以继续进行下去,即使那意味着要做一些不好的工作。我可能只是在做一些愚蠢的事情吗?


问题答案:

我注意到您说您正在使用NetTiers进行代码生成。

我自己使用过NetTiers,发现如果您从表中删除外键约束,请将其重新添加到同一表中,然后在数据库中进行更改后再次运行NetTiers的构建脚本可能有助于重置数据访问权限层。我偶尔尝试过这种方法,但效果很好。

祝您好运。



 类似资料:
  • 问题内容: 我们有一个用于生成唯一数字键的表。这些键然后用作其他表中的PrimaryKey。表结构是这样的: 所以我们在这个表中有数据 所以,当我们需要下一个主键表中我们可以得到从这个表,其中是,它会给我们400,我们的增量(400 + 1),它和我们更新表也是这个关键。所以我们现在是401。 我们用于此目的的sql是: SQL1: 我的问题是,是否需要锁定表,以便如果多个用户同时调用此键,则键可

  • 主要内容:事务的属性,事务执行流程在数据库中,我们将一条 SQL 语句称为一次基本的操作。将若干条 SQL 语句“打包”在一起,共同执行一个完整的任务,这就是事务。 事务( Transaction)由一次或者多次基本操作构成,或者说,事务由一条或者多条 SQL 语句构成。 事务有一个最显著的特征,就是它包含的所有 SQL 语句作为一个整体向数据库提交,只有所有的 SQL 语句都执行完成,整个事务才算成功,一旦某个 SQL 语句执行

  • 主要内容:COMMIT命令,ROLLBACK命令,SAVEPOINT命令,SET TRANSACTION命令事务是与数据库相反执行的工作单元,从数据库读取或写入数据库的任何事务。事务是对数据库的一项或多项更改的传播。 例如,如果我们创建记录、更新或删除表的历史记录,那么也应该创建事务。控制数据完整性的操作是必不可少的,它用于处理数据库的错误。我们向组中添加一些 SQL 查询并执行事务部分。 事务属性: 事务有四个属性,称为 ACID 属性 - 原子性 - 确保与工作单元的所有操作都成功完成; 否

  • 主要内容:开始和结束事务,提交事务,回滚事务,自动事务控制在本章中,我们将讨论和学习PL/SQL中的事务。 数据库事务是由一个或多个相关SQL语句组成的原子工作单元。它被称为原子操作,因为构成事务的SQL语句带来的数据库修改可以共同提交,即永久化到数据库或从数据库回滚(撤销)。 成功执行的SQL语句和提交的事务不一样。即使成功执行SQL语句,除非提交包含语句的事务,否则可以回滚该语句,并且可以撤消语句所做的所有更改。 开始和结束事务 事务有开始和结束。当

  • 问题内容: 在Spring Framework手册中,它们声明对于PROPAGATION_REQUIRES_NEW,当前事务将被挂起。 那“暂停交易”是什么?超时计时器停止指望当前事务吗?这种暂停的实际含义是什么? 谢谢, 问题答案: 这并不意味着什么特别的事情,挂起的事务只是暂时不用于插入,更新,提交或回滚的事务,因为由于指定的传播属性应创建一个新事务,并且只能激活一个事务同时。 基本上有两种事

  • 在会话范围内具有一个简单的CDI bean,其中注入了一个实体管理器: 现在,当通过EL#{myBean.test插入}调用函数时,有两件事似乎很奇怪: 1)将@Transactional注释移动到方法创建(int)我得到: javax.persistence。TransactionRequiredException:JBAS011469:执行此操作需要事务(使用事务或扩展持久性上下文) 2) 改