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