Транзакция против хранимой процедуры - PullRequest
0 голосов
/ 15 апреля 2019

Многозначные атрибуты являются распространенным сценарием любого ориентированного на базы данных приложения.Одним из распространенных вариантов использования является добавление нового объекта, который попадает в обе таблицы и связан их внешним ключом.

Например, новый сотрудник был добавлен в систему в первый день своей работы, когда он начал работать в определенной команде в компании.Запись этого человека сохраняется в двух таблицах: в одной таблице хранится личная информация (employee) сотрудника, а в других таблицах (employee_team) хранится продолжительность сотрудника с каждой командой за все время их пребывания в компании.Система управления сотрудниками имеет одну длинную форму для нового сотрудника (это просто пример для представления варианта использования), которая берет всю эту информацию о сотруднике, включая отдел, с которым этот человек начинает работать.Чтобы сохранить вставку этой информации в две таблицы, очевидно, которые связаны с использованием атрибута внешнего ключа.

Одним из способов реализации такого сценария является использование Begin Transaction и Commit и выполнение 2 запросов на вставку между ними.из приложения.Другое решение может создать параметризованную хранимую процедуру и выполнить один вызов этой процедуры из приложения.

С точки зрения базы данных оба решения, вероятно, приводят к одним и тем же действиям на сервере базы данных.Однако справедливо ли сказать, что, с точки зрения приложения, для первого решения может потребоваться больше времени для связи в два раза, чем для более позднего решения?Каковы плюсы и минусы каждой процедуры?Каковы преимущества использования одного над другим, как с точки зрения базы данных, так и с точки зрения приложения?

Моя нынешняя система основана на PHP и MySql, но я предполагаю, что этот сценарийобщий для всех типов РСУБД.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Похоже, что транзакции и хранимые процедуры - это два разных подхода к одной и той же проблеме.Они не.Чтобы обеспечить согласованность данных между двумя участвующими таблицами, вам все равно потребуется использовать транзакцию в хранимой процедуре.

Теперь ясно, что если вы генерируете отдельные операторы в клиенте, скажем, для BEGIN TRANSACTION, SELECT..., INSERT..., COMMIT, тогда это приводит к большему количеству сообщений, передаваемых туда и обратно, чем если вы выдадите все это как один составной оператор SQL, но сетевое взаимодействие в любом случае редко является узким местом в производительности базы данных.

0 голосов
/ 15 апреля 2019

Если ваше приложение отправляет один запрос , т. Е.

BEGIN TRANSACTION

--INSERT 1

--INSERT 2

END TRANSACTION

Тогда это все еще один вызов базы данных, просто происходит две вещи, и он в основном эквивалентен (игнорируя особенности планов запросов и т. Д.) Как вызов одной хранимой процедуры ...

Edit :: Как я уже сказал, это зависит от продукта, который вы используете, но, например, в Microsoft SQL Server вы можете сделать

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