Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL事务的实际成本是多少?_Sql_Sql Server_Ado.net - Fatal编程技术网

SQL事务的实际成本是多少?

SQL事务的实际成本是多少?,sql,sql-server,ado.net,Sql,Sql Server,Ado.net,这需要一点背景知识。我正在创建一个web应用程序(带有SQL Server后端的ASP.NET/VB.NET),该应用程序将接受一个申请以获得资金,并且此表单具有三个人的联系人信息字段。因为这三个人的信息(姓名、电子邮件、电话)都是相同的,所以我选择将联系人信息存储在与应用程序分开的表中。在应用程序表中,这三个联系人都有一个ID字段,指向联系人表中的联系人 然而,这在我的CRUD工作中提出了一个有趣的问题。在一个SQL事务中创建、更新和检索应用程序和所有三个联系人的信息的唯一方法需要非常复杂的存

这需要一点背景知识。我正在创建一个web应用程序(带有SQL Server后端的ASP.NET/VB.NET),该应用程序将接受一个申请以获得资金,并且此表单具有三个人的联系人信息字段。因为这三个人的信息(姓名、电子邮件、电话)都是相同的,所以我选择将联系人信息存储在与应用程序分开的表中。在应用程序表中,这三个联系人都有一个ID字段,指向联系人表中的联系人

然而,这在我的CRUD工作中提出了一个有趣的问题。在一个SQL事务中创建、更新和检索应用程序和所有三个联系人的信息的唯一方法需要非常复杂的存储过程。换句话说,通过多个事务检索这些信息(对我来说)要简单得多。然而,由于这些信息从来都不是独立需要的,所以我总是要进行多个事务来获取一个应用程序的信息

所以我的问题是:

  • 这个设计是不是太夸张了?每个应用程序的联系人永远不会超过三人,而且必须正好有三人。我把这些信息移到一个单独的表中是否过于复杂了
  • 与编写复杂的存储过程而只需要一个事务相比,执行多个SQL事务的实际成本是多少
  • 一般来说,对于使用ADO.NET的web应用程序,SQL事务的成本是多少
  • 谢谢你接受了那冗长的解释

    *编辑*


    在阅读了你的一些回复后,我似乎用错了“交易”一词。我真正想知道的是在一个连接上执行多个查询的成本,而不是执行一个查询的成本。很抱歉造成误解。

    您在这里使用的术语“交易”有点不正确。我想你指的是一个简单的数据库查询,ACID事务助手

    也就是说,很难说。默认情况下启用的连接池将防止需要打开三个/四个单独的连接

    您可能甚至不需要多个查询来获取数据,并且可以连接两个表来检索数据,例如:

    SELECT app.field1, app,field2, contact1.name, contact2.name, contact3.name
    FROM Applications AS app
    INNER JOIN Contacts AS contact1 ON app.contact1ID = contact1.id
    INNER JOIN Contacts AS contact2 ON app.contact2ID = contact2.id
    INNER JOIN Contacts AS contact3 ON app.contact3ID = contact3.id
    
    或者类似的情况,根据您的情况(从应用程序向选择列表添加新字段,从每个联系人表返回更多数据,等等)。如果表索引正确,查找速度非常快,可能根本不会影响性能

    如果您正在插入/更新数据,那么是的,您需要多个查询来执行该操作,但是数据的选择可以在一个查询中进行


    当然,另一种选择是将数据放回原始的应用程序表中,首先不需要第二个表。此时,不需要额外的连接或任何其他操作。

    使用一个存储过程来完成所有操作,因此您只需要打开一个sql连接

    web表单中的每个变量都映射到存储过程中的一个参数(包括隐藏的联系人和应用程序密钥,新应用程序默认为0)

    在该过程中,如果记录键为0,则该过程会将记录添加到数据库中,并使用scope_identity()快速检索键。如果向该过程发送非零键,则该过程会更新该记录。然后,该过程返回所有数据,并将所有存储过程变量声明为输出

    然后,您可以将该过程包装在sql begin/end事务中,使其成为all或nothing sql命令

  • 这并不过分。这是一个很好的规范化,也是一个不重复原则的很好的应用。系统的要求可能会改变,将来你可能需要2到4个联系人,而不是3个
  • 您不需要执行任何复杂的存储过程。您不需要执行任何异常的操作。您根本不需要存储过程
  • 不知道
  • 当你说“transaction”时,我想你的意思是“query”。当我想获取一个应用程序的数据时,我会使用两个单独的简单查询:

    SELECT *
      FROM application
    


    这是两个独立的查询,但很重要。更重要的部分是以合理的方式设计数据库。

    将数据库从一个一致状态移动到另一个一致状态需要事务处理。此处的“一致”适用于数据库的应用程序视图。典型示例是数据库之间的资金转移两个账户:你必须借记一个账户,贷记另一个账户。在这两个操作之间,数据库不一致,有一些钱已经“消失”(从一个账户借记的金额不存在)。但在事务结束时,数据库再次保持一致。您需要一个事务来跨越这两个操作,以防止读者查看不一致的数据库,并确保在崩溃时数据库保持一致

    您说,为了在单个事务中处理逻辑中的多个项目,您需要复杂的过程。事实并非如此,事务作用域与请求作用域是正交的:客户机可以启动一个事务,通过在3个调用中调用3个过程执行3个操作,然后提交事务。不需要所有操作可以在一个存储过程中完成

    因此,事务不应导致显著的过程开销。事实上,一个过程将不受事务的影响。一个编写良好的过程在事务内部调用时,以及在没有事务的情况下调用时,都应正确运行。有关在事务存在时正确运行的过程的模板,请参阅以及例外情况

    最后,事务的实际成本是什么?事务写入数据(读取并不真正需要事务),因此它们锁定修改的行
    SELECT *
      FROM contact
    
    SqlCommand cmd = new SqlCommand(@"
    exec usp_firstProc @arg1, @arg2;
    exec usp_secondProc @arg2, @arg3;
    exec usp_thirdProc @arg1, @arg3;", connection);
    cmd.Parameters.Add("@arg1", someValue);
    ...
    cmd.ExecuteNonQuery();