交易与存储过程

时间:2019-04-15 11:27:44

标签: database stored-procedures transactions foreign-keys rdbms

多值属性是任何面向数据库的应用程序的常见方案。常见用例之一是添加一个新实体,该实体进入两个表并通过其外键连接。

例如,新员工在工作的第一天就添加到系统中,在该系统中,她/他开始在公司的某个团队下工作。此人的记录保存在两个表中,一个表存储员工的个人信息(employee),而其他表(employee_team)存储每个团队在整个团队中员工在整个团队中的工作时间。公司。员工管理系统有一个新员工的长格式(这只是代表用例的一个例子),它吸收了所有员工信息,包括此人开始与之合作的部门。为了将此信息插入到两个表中,这些表显然是使用外键属性关联的。

实现这种情况的一种方法是使用Begin TransactionCommit并在应用程序之间进行两次插入查询。另一个解决方案可以创建一个参数化的存储过程,并从应用程序中对该过程进行一次调用。

从数据库的角度来看,两种解决方案都可能导致数据库服务器中的活动相同。但是,可以公平地说,从应用程序的角度来看,前一种解决方案可能比第二种解决方案花费更多时间进行两次通信?每个程序的优缺点是什么?从数据库的角度和应用程序的角度来看,使用一个方法比另一个方法有什么好处?

我当前的系统基于PHPMySql,但是我想,这种情况对于所有类型的RDBMS都是常见的。

2 个答案:

答案 0 :(得分:0)

如果您的应用程序发送了一个查询

BEGIN TRANSACTION

--INSERT 1

--INSERT 2

END TRANSACTION

然后它仍然是对数据库的一次调用,它恰好在做两件事,并且基本上等效于(忽略有关查询计划的细节等)调用单个存储过程...

编辑::正如我所说,这取决于您使用的产品,但是例如在Microsoft SQL Server中,您可以这样做

INSERT INTO [Table] ([Name]) VALUES ('Bob');  
INSERT INTO [Table2] ([Table1Id]) VALUES (SCOPE_IDENTITY());  

答案 1 :(得分:0)

听起来像事务和存储过程是解决同一问题的两种不同方法。他们不是。为了确保两个参与表之间的数据一致性,您仍然需要在存储过程中使用事务。

现在,很明显,如果您在客户端中为BEGIN TRANSACTIONSELECT...INSERT...COMMIT发出单独的语句,则会产生更多消息与将整个事情作为一个复合SQL语句发出来回来回去相反,但是无论如何,网络通信很少会成为数据库性能的瓶颈。