Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Как лучше update очень важные финансовые records в таблице, по одной в цикле или все вместе? И почему?
С rollback и всеми делами.
13 сен 12, 23:02    [13161327]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
мадама,

главное в транзакции.

sql не любит циклов, поэтому разом все делайте.
Ну сами подумайте какой смысл дергать по одной записи и обновлять по одной?
Есть конечно исключения, например ооочень большие объемы, которые разом сложно обработать, тогда можно попробовать в цикле пачками апдейтить.
Еще в цикле по одной придется апдейтить в том случае, когда невозможно обновить разом, когда нужно собрать очень много данных для апдейта к примеру.
13 сен 12, 23:32    [13161410]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Владимир Затуливетер,

А как насчет rollback? Смогу я узнать в какой записи случилась ошибка если я буду делать всё целиком? И как я смогу тогда отделить проапдейтеные записи от не проапдейтенных? Или делать rollback на всё вместе тогда? Вот что мне важно.
13 сен 12, 23:39    [13161426]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Посетитель
Member

Откуда:
Сообщений: 1232
мадама,

а что Вы подразумеваете под ошибкой?
13 сен 12, 23:43    [13161436]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Если заверещит какой-нибудь тригер например.
13 сен 12, 23:59    [13161474]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
или constraint
14 сен 12, 00:24    [13161523]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
мадама,

для какой имено записи сложно наверное будет определить (при апдейте разом всех записей), хотя возможно. с constraints легче, а вот с триггерами сложнее.

обрабатывайте по отдельности тогда, если скорость не критична.
как раз и отобразите какая запись обрабатывается и если будет ошибка будет понятно где проверять.
установите сами транзацию либо на пакет полностью, либо на каждую запись по отедельности.
Имейте в виду если транзакция будет одна на все записи и они будут обрабатываться долго то возможно проблемы с доступом к обновляемым записям из других сессий (приложений).
14 сен 12, 00:32    [13161544]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Владимир Затуливетер,
Наверное на каждую запись. Спасибо!
14 сен 12, 00:44    [13161572]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Посетитель
Member

Откуда:
Сообщений: 1232
мадама,

я чтот совсем лох видать.
никак не могу придумать триггер/констрэйнт, который позволит при выполнении одного апдейта обновить только часть строк, а затем отвалиться с ошибкой

разве что в триггере какой-нибудь цикл/курсор замутить по обработке каждой записи
14 сен 12, 01:02    [13161607]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
мадама
Владимир Затуливетер,
Наверное на каждую запись. Спасибо!
Не ведитесь на профонацию

Нужно правильно генерировать ошибку (в триггерах) с указанием что,где и почему неправильно.
Во вторых, не режьте с плеча. Критически вещи должны быть реализованы идеально.
Ошибок не должно быть вообще, валидируйте данные заранее, ещё на клиенте.
Решайте причину проблем.
14 сен 12, 13:47    [13164687]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Посетитель
никак не могу придумать триггер/констрэйнт, который позволит при выполнении одного апдейта обновить только часть строк, а затем отвалиться с ошибкой
Правильно!
Ибо нельзя смешивать логически несвязанные данные в одной транзакции.

Если есть массовые вещи (аля закачки), то данные валидируются заранее.
14 сен 12, 13:49    [13164716]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Тут у меня образовалось нечто такое. Правильно ли это заключать в одну транзакцию все эти стейтменты? И вообще правильная ли здесь логика? Еще перед всем этим у меня есть селект стейтменты, это нормально что я начинаю транзакцию позже? Покритикуйте.

	BEGIN TRANSACTION
		    
		UPDATE ....here is update statement
		
		SET @Error = @@ERROR		
		SET @RowsAffected = @@ROWCOUNT				
			
		IF @Error <> 0
			BEGIN	
				set @msg='Error encounted during transaction(1). '
				GOTO Failure				
			END		
			

		SELECT ... into #tmp4
			FROM  ...
		
		INSERT ......here is insert statement

		SET @Error = @@ERROR
		SET @RowsAffected = @@ROWCOUNT				
		
		IF @Error <> 0
			BEGIN 
				set @msg= @msg+ 'Error encounted during transaction(2). '
				GOTO Failure				
			END

	COMMIT TRANSACTION 	
	SET @Result = 0
	
	RETURN
	
Failure:    
	
	BEGIN
		SET @Result = @Error	
		ROLLBACK TRANSACTION 
		@msg=@msg+ 'Update is canceled! '
		RAISERROR('%s', 16, 1, @msg)
	END
25 сен 12, 22:48    [13221890]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Матерь божья.
Ладно, допустим код не работающее говно. Но дело в том что вы не понимаете что делаете, во всём.
Даже базовых вещей не понимаете.

У вас не "лежит" к этому, это не ваше, может вы наймёте более понимающего?

1. Транзакция определяет целостность. Вы должны понять основополагающую суть этого понятия абсолютно точно.
2. Не надо подручными первыми попавшимися средствами делать.
3. У каждой вещи есть свой нюансы, их обязательно надо знать все.

Тупо накалякать порядок действий, думая что детали сами рассосутся, как в обычной жизни, так не получится.

Некоторые думают, что если некто Б понял что сказал А, то А понимает то что он сказал. Часто это не так. Часто передают информацию сами не понимая его смысл (и даже заблуждаясь что понимают).
Некоторые тем и живут что безвозмездно получают помощь от окружающих во всём, от материального до наполнения смысла.

Есть такое ощущение что вы это откуда-то содрали. Такое в голову придти не может.

1. В одной транзакции должно быть только то что логически связано. Если оно не связано, нужно разделять на куски.
2. В одной транзакции должно быть всё то, что определяет её связанность.
Если вы изменяете баланс - пополнение, то значение ДО и значение ПОСЛЕ неразрывно связано.
Если у вас много строк, то если они не связаны между собой логически, то объединять в одну транзакцию надо обоснованно (но и тупо дробить тоже нельзя - есть много причин почему).

Нельзя сказать, что всё нужно в транзакцию, или "предшествующий запрос" должен быть всегда В или всегада ВНЕ. Это глупость.
Это определяется логикой. Весь код определяется логикой, нет никаких шаблонов писанины.

Выкиньте @@Error в таком виде лучше не использовть, @@RowCount используется ошибочно и непонятно для чего.
Ошибки обрабатываются через TRY / CATCH (уже 21 век, алё).

В идеале никаких SET IF WHILE не должно быть, а GOTO и подавно. Не должно быть лишних и множественных запросов - в идеале один. Временные таблицы - признак костылей, нужно ещё доказать что это не ошибка понимания кодера.

Вы не можете быть уверены в существовании транзакции после каждой команды. Поэтому перед RollBack надо проверять его возможность.
26 сен 12, 13:14    [13224910]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Mnior
...Ошибки обрабатываются через TRY / CATCH (уже 21 век, алё)...
Ну, а вдрук у чилавека 2000 или того хуже...
26 сен 12, 13:37    [13225178]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
tpg
Ну, а вдрук у чилавека 2000 или того хуже...
Ну о такой подставе я даже думать не хочу.
Лучше опции включить о терминировании батча при ошибке или что-то типа.
26 сен 12, 22:57    [13228816]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
У нас к соажлению sql server 2000, они хотят переходить сразу на 2008. Mnior, я же и не прикидываусь знатоком t-sql. Если отбрость драму с заламыванием рук, спасибо за замечания. I'll take it.
27 сен 12, 20:24    [13235211]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
Мне нужно, что бы оба, и мой insert, и update откатились в случае ошибки. Поэтому я запхнула всё в одну транзакцию. Я не знаю как это по другому сделать.
27 сен 12, 22:51    [13235631]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
hallabud
Member

Откуда: Киев
Сообщений: 245
мадама
Мне нужно, что бы оба, и мой insert, и update откатились в случае ошибки.

Не забудьте в таком случае имхо поставить
SET XACT_ABORT ON;

SET XACT_ABORT (Transact-SQL)
27 сен 12, 23:07    [13235677]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
мадама
Еще перед всем этим у меня есть селект стейтменты, это нормально что я начинаю транзакцию позже?
А это вам уже типа понятно?
27 сен 12, 23:49    [13235840]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше update records в таблице?  [new]
мадама
Member

Откуда: страна кленового листа
Сообщений: 459
hallabud,
Спасибо!
28 сен 12, 00:36    [13235999]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить