powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по блокировкам
8 сообщений из 8, страница 1 из 1
Вопрос по блокировкам
    #40135524
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Изучаю блокировки.

Есть такой SQL-код
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
--Основная таблица, в которой будут добавляться и удаляться строки
CREATE TABLE dbo.MyTable1
(
	SKU NVARCHAR(10),
	Year_ SMALLINT,
	Month_ SMALLINT,
	Sum_ DECIMAL(8,2)
) ON [PRIMARY];

--Справочная таблица
CREATE TABLE dbo.MyTable2
(
	SKU NVARCHAR(10),
	Value_ Decimal(8,2)
) ON [PRIMARY];

GO

--Процедура для расчета в основной таблице
--В основную таблицу добавляется рассчитанные строки по соответствующим атрибутам
CREATE PROCEDURE dbo.MyProcedure_Calculation
AS
BEGIN
	DECLARE @Total NVARCHAR(10) = 'Расчет';

	DELETE dbo.MyTable1 WHERE SKU = @Total;

	INSERT INTO
		dbo.MyTable1(SKU, Year_, Month_, Sum_)	
	SELECT
		@Total,
		t1.Year_,
		t1.Month_,
		SUM(t1.Sum_ * t2.Value_)
	FROM
		dbo.MyTable1 t1
	LEFT JOIN
		dbo.MyTable2 t2
	ON
		t1.SKU = t2.SKU
	GROUP BY
		t1.Year_,
		t1.Month_;
END

GO

--Процедура для вставки строк
CREATE PROCEDURE dbo.MyProcedure_Add
	@SKU NVARCHAR(10),
	@Year_ SMALLINT,
	@Month_ SMALLINT,
	@Sum_ DECIMAL(8,2)
AS
BEGIN
	INSERT INTO
		dbo.MyTable1(SKU, Year_, Month_, Sum_)
	VALUES
		(@SKU, @Year_, @Month_, @Sum_);

	EXEC dbo.MyProcedure_Calculation;
END

GO

--Процедура для удаления строк
CREATE PROCEDURE dbo.MyProcedure_Delete
	@SKU NVARCHAR(10),
	@Year_ SMALLINT,
	@Month_ SMALLINT
AS
BEGIN
	DELETE dbo.MyTable1 WHERE SKU = @SKU AND Year_ = @Year_ AND Month_ = @Month_;

	EXEC dbo.MyProcedure_Calculation;
END

GO

--Справочник. Ввод данных.
INSERT INTO
	dbo.MyTable2 (SKU, Value_)
VALUES
	('SKU1', 0.1)
	,('SKU2', 0.2)
	,('SKU3', 0.3);

--Разные пользователи вносят данные с портала
--Для простоты данного примера добавляются и удалятся по одной строке

--1-й пользователь вводит
EXEC dbo.MyProcedure_Add'SKU1', 2021, 1, 1000.00;
EXEC dbo.MyProcedure_Add 'SKU1', 2021, 2, 1100.00;
EXEC dbo.MyProcedure_Add 'SKU1', 2021, 3, 1200.00;

--2-й пользователь вводит
EXEC dbo.MyProcedure_Add 'SKU2', 2021, 1, 800.00;
EXEC dbo.MyProcedure_Add 'SKU2', 2021, 2, 900.00;
EXEC dbo.MyProcedure_Add 'SKU2', 2021, 3, 1000.00;
EXEC dbo.MyProcedure_Add 'SKU3', 2021, 1, 900.00;
EXEC dbo.MyProcedure_Add 'SKU3', 2021, 2, 800.00;
EXEC dbo.MyProcedure_Add 'SKU3', 2021, 3, 1100.00;
EXEC dbo.MyProcedure_Delete'SKU3', 2021, 1;
EXEC dbo.MyProcedure_Delete'SKU3', 2021, 2;
EXEC dbo.MyProcedure_Delete'SKU3', 2021, 3;

--Иногда процедура dbo.MyProcedure_Calculation запускается отдельно.
--Важно, чтобы во время выполнения процедуры dbo.MyProcedure_Calculation
--не было вызовов процедур dbo.MyProcedure_Add и dbo.MyProcedure_Delete.
--в т.ч. запуск другого экземпляра dbo.MyProcedure_Calculation

EXEC dbo.MyProcedure_Calculation;

--Просмотр
SELECT * FROM MyTable1 ORDER BY SKU, YEAR_, Month_;


1. Для того, чтобы настроить блокировки для данной задачи неявные транзакции (INSERT и DELETE) нужно обязательно перевести в явные (INSERT и DELETE поместить в BEGIN TRANSACTION)?

2. Длительность блокировки не задаем, так как ожидает выполнение других. Для данной задачи подходит блокировка на уровне таблицы и режим блокировки монопольная (exclusive, X)?
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135526
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
настроить блокировки


Что такое "настроить блокировки"?


ferzmikk
обязательно перевести в явные (INSERT и DELETE поместить в BEGIN TRANSACTION)?


Наличие/отсутствие явной транзакции влияет на "время жизни" блокировки.


ferzmikk
Для данной задачи подходит блокировка на уровне таблицы и режим блокировки монопольная (exclusive, X)?


Для какой задачи?
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135530
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Для какой задачи?
Код: sql
1.
2.
3.
4.
--Иногда процедура dbo.MyProcedure_Calculation запускается отдельно.
--Важно, чтобы во время выполнения процедуры dbo.MyProcedure_Calculation
--не было вызовов процедур dbo.MyProcedure_Add и dbo.MyProcedure_Delete.
--в т.ч. запуск другого экземпляра dbo.MyProcedure_Calculation
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135533
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
msLex
Для какой задачи?
Код: sql
1.
2.
3.
4.
--Иногда процедура dbo.MyProcedure_Calculation запускается отдельно.
--Важно, чтобы во время выполнения процедуры dbo.MyProcedure_Calculation
--не было вызовов процедур dbo.MyProcedure_Add и dbo.MyProcedure_Delete.
--в т.ч. запуск другого экземпляра dbo.MyProcedure_Calculation



Если задача стоит именно в таком виде, то смотрите в сторону applock.
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135578
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Наличие/отсутствие явной транзакции влияет на "время жизни" блокировки.
Правильно понимаю, что при отсутствии перевода в явные транзакции записи (INSERT, DELETE) могут потеряться?
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135586
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
msLex
Наличие/отсутствие явной транзакции влияет на "время жизни" блокировки.
Правильно понимаю, что при отсутствии перевода в явные транзакции записи (INSERT, DELETE) могут потеряться?



Я даже не представляю, что может значить "записи ... DELETE ... потеряться"


Вы так и не описали задачу, но хотите узнать, правильно ли она решена.
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135599
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
msLex
Для какой задачи?
Код: sql
1.
2.
3.
4.
--Иногда процедура dbo.MyProcedure_Calculation запускается отдельно.
--Важно, чтобы во время выполнения процедуры dbo.MyProcedure_Calculation
--не было вызовов процедур dbo.MyProcedure_Add и dbo.MyProcedure_Delete.
--в т.ч. запуск другого экземпляра dbo.MyProcedure_Calculation


msLex
Вы так и не описали задачу, но хотите узнать, правильно ли она решена.
Важно, чтобы не было ошибок и конфликтов при одновременном запуске этих процедур от разных пользователей.

А если конкретнее:

- Если запущена процедура dbo.MyProcedure_Calculation и в это время не закончена процедура dbo.MyProcedure_Add или dbo.MyProcedure_Delete, то dbo.MyProcedure_Calculation ждет своей очереди.

- Если запущена процедура dbo.MyProcedure_Add или dbo.MyProcedure_Delete и в это время не закончена процедура dbo.MyProcedure_Calculation, то dbo.MyProcedure_Add или dbo.MyProcedure_Delete ждет своей очереди.

- Если запущена процедура dbo.MyProcedure_Calculation и в это время не закончено выполнение другого экземпляра dbo.MyProcedure_Calculation, то первая dbo.MyвыполнениеProcedure_Calculation ждет своей очереди.

- Если запущена процедура dbo.MyProcedure_Add или dbo.MyProcedure_Delete и в это время не закончено выполнение другого экземпляра dbo.MyProcedure_Add или dbo.MyProcedure_Delete, то первая dbo.MyProcedure_Add или dbo.MyProcedure_Delete ждет своей очереди.

ferzmikk
обязательно перевести в явные (INSERT и DELETE поместить в BEGIN TRANSACTION)?
Для текущей задачи похоже что обязательно.
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #40135613
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

на уровне процессов можно применить блокировки уровня приложения, как писали выше. Процедура sp_getapplock и т.д.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по блокировкам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]