Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 11 12 13 14 15 [16] 17 18 19 20 .. 25   вперед  Ctrl
 Re: Нужна помощь  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Bogdanov Andrey
Кудряшка
Выделенное - фигню Вы написали.
Ну вот и Вы перешли на так непонравившися Вам метод ведения дискуссии Эталоном Этаноловичем. Могу прцитировать Вас же из соседнего топика:
Ваше высокопарное "чушь" и "пурга" - лично для меня не аргумент.


А с вами завтра договорим, а то у меня уже сегодня сил нет.
26 май 09, 15:24    [7229324]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Кудряшка
если N манипулаций с данными не рассматриваются как одна цельная операция, они не должны быть в одной транзакции

Ну что Вы, сударыня, есть не только белое и чёрное.

Применяя терминологию Задэ, можно сказать и так:
Это скорее всего одна транзакция,

а не только так:
Это или транзакция или нет!

To Gluk (Kazan):

Вполне возможно и в MS: с помощью save tran
Каждая процедура может быть вызвана или первой или внутри чужой транзакции.
Отсюда принцип:

Проверяю не я ли (процедура) хозяйка транзакции?Если я, то начинаю (и буду комитать роллбэчить)
Если нет, то SAVE TRAN:
select @tranname = 'Procedure_Name' + cast(@@NESTLEVEL as varchar(24))

if @trancount = 0 begin tran @tranname
else save tran @tranname

А на выходе - в обратном порядке:
exit_success:
	if @trancount = 0 commit tran @tranname
	return @er
exit_error:
	rollback tran @tranname
	raiserror ('Error in Procedure_Name. %s', 16, 1, @message)
	return (case @er when 0 then -1 else @er end)
26 май 09, 15:35    [7229453]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
SQLMantis
Member

Откуда: Москва
Сообщений: 240
Gluk (Kazan)

А вы попробуйте залить (скажем в Oracle) 1000000 записей с транзакциями по 1000 записей,
а потом туда же с autocommit-ом. И сразу все станет ясно.


Прошу прощения, но Вы о разном, IMHO.
Ясно что с commit по 1000 записей будет быстрее, но заворачивание в транзакцию тут предлагается ради скорости. Кудряшка же говорит о том что если внесение всего лимона записей - суть одна транзакция (отсутствие хоть одной нарушит бизнес-логику), логично завернуть все это хозяйство в одну транзакцию, следуя принципу либо все либо ничего.
26 май 09, 15:43    [7229517]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Кудряшка
Gluk (Kazan)
Кудряшка
martin_bishop

To Кудряшка
Всё в одной тр-ции - нет траты на открыть-закрыть, но тяжёлый откат и большой лог.
каждая строка в своей тр-ции - много открыть-закрыть, но короткий лог.


причем тут лог, открывать/закрывать... ???


А вы попробуйте залить (скажем в Oracle) 1000000 записей с транзакциями по 1000 записей,
а потом туда же с autocommit-ом. И сразу все станет ясно.


Я для конкретного примера за то, чтобы транзакции были по одной записи:)
(это вариант с autocommit-ом ?)


считайте что да
26 май 09, 15:56    [7229638]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
martin_bishop
Вполне возможно и в MS: с помощью save tran
Каждая процедура может быть вызвана или первой или внутри чужой транзакции.


Ооо ... MS SQL научился откатывать вложенные транзакции ???
до завтра
26 май 09, 15:58    [7229660]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
SQLMantis
Кудряшка же говорит о том что если внесение всего лимона записей - суть одна транзакция (отсутствие хоть одной нарушит бизнес-логику), логично завернуть все это хозяйство в одну транзакцию, следуя принципу либо все либо ничего.


Принципы закончаться на первой же практической заливке данных
Принципы - это излечимо
26 май 09, 15:59    [7229678]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
Кудряшка
Выделенное - фигню Вы написали. (не сделжалась и решила вернуться)

Зря решили. Сядете в лужу, по сравнению с которой rowid - муравьиные слёзы.

Кудряшка
Примечание: Потрудитесь сменить тон, а то несолидно.

Никогда не претендовал на солидность.

Кудряшка
Что хотелось бы сказать: Я согласна, что 999'999 должны в базу попасть. Только я в упор не понимаю зачем при этом весь миль0н в одной транзакции, когда по СУТИ каждый инсерт, если он прошел удачно и без ошибок, принимается(коммит) независимо от других.

ЗАЧЕМ весь миллион помещать в одну общую транзакцию? Обьясните...

Причины могут быть самые разные. Например:

1. Есть условия целостности, при [не]выполнении которых их таки надо откатить целиком, и эти условия можно проверить только в конце операции.
2. Пользователям не стоит видеть "наполовину загруженные" данные, особенно если импорт упадёт на середине.

Однако, самая частая причина - производительность. Выполнить массовую операцию (SQL-операторы) с миллионом записей - обычно куда быстрее, нежели выполнять его миллион раз для каждой записи. Запустить хранимку для обработки миллиона записей - обычно куда быстрее, чем вызвать её миллион раз по одной записи. Выполнение commit также либо требует ресурсов (flush и прочее, что гарантирует сохранение информации на дисках) либо же сбой питания/железа/базы/операционки способен повлечь за собой потерю закоммиченных данных, что вовсе не всегда допустимо.
26 май 09, 16:01    [7229690]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Gluk (Kazan)

Ооо ... MS SQL научился откатывать вложенные транзакции ???


с 2000 версии этим пользуемся.
Это не полноценная вложенность как в Оракле, но позволяет откатить-сохранить внутреннюю, не трогая наружной (транзакции хозяина, так сказать)
26 май 09, 16:05    [7229723]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
почему неполноценная?
потому, что при этой технике счётчик транзакций будет иметь значение либо 0 либо 1

А в остальном saved - как будто вложенная
26 май 09, 16:11    [7229790]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
softwarer
Member

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

1. Что такое транзакция, мы предположительно знаем и понимаем.

2. Вложенная транзакция - транзакция, выполняемая как часть внешней. Она может сама по себе откатиться, и внешняя может после этого продолжить работу, но если вложенная получила commit - реальный commit/rollback этих изменений определяется внешней транзакцией.

3. Автономная транзакция - независимая транзакция, исполняемая "по ходу" основной, её commit сохраняет данные даже после rollback вызвавшей.

4. Вложенная транзакция в общем похожа на savepoint со строгим соблюдением парности.

В Oracle, насколько я знаю, полноценных вложенных транзакций нет. Есть автономные, а savepoint-ы идут с некоторыми ограничениями (скажем, нельзя изменить установки set transaction), да и синтаксис требует if-ов, чтобы использовать код и как независимую, и как вложенную транзакцию.
26 май 09, 16:21    [7229895]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
SQLMantis
Member

Откуда: Москва
Сообщений: 240
Gluk (Kazan)
SQLMantis
Кудряшка же говорит о том что если внесение всего лимона записей - суть одна транзакция (отсутствие хоть одной нарушит бизнес-логику), логично завернуть все это хозяйство в одну транзакцию, следуя принципу либо все либо ничего.


Принципы закончаться на первой же практической заливке данных
Принципы - это излечимо


Опять не о том.
26 май 09, 16:22    [7229908]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To softwarer:
В такой терминологии я имел ввиду именно вложенные (вернее их имитация через savepoint)
Как реализовать автономные транзакции в MS - в голову приходит только асинхронн через SB и то, начиная с 2005 и не во всех редакциях
26 май 09, 17:37    [7230599]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
softwarer
Умница. В точку. В самом деле что-то не так. Сработала защита целостности, например, не дала загрузить дубль. В этом случае надо разобраться с тем, кто прислал из внешнего источника этот миллион строк. И разобраться в то время, когда 999'999 строк будут лежать в базе и доступны пользователям, а "неправильная" - тоже лежать в базе, и тоже доступна, но с флагом ошибки.


Позволю себе еще раз вмешаться. Но, помоему, это уже не первый заход.

И так мы создали "защиту целостности", которая должна исключить факт появления дубля, исходя из чего? Из того, полагаю, что дубли таки не должны появится. И заливку организовали простым INSERT ... SELECT .... Т.е. модель данных и способы ее заполнения были спроектированы исходя из каких то требований. Не так ли?

Теперь, оказывается, что все таки и строка, нарушающая существующие ограничения, таки должна попасть в бд, "но с флагом ошибки".

Какие у нас варианты? Как мне казалось, самым простым, изменить заливку с INSERT ... SELECT... на нечто более сложное, например, MERGE, взводя флаг ошибки для вставляемых записей, дублирующих имеющиеся. Естественно, при это неминуемо изменение ограничения, которое должно использовать этот флаг.

К чему это я. К примеру об "ошибках в транзакциях" и их "пропусках", что на самом деле, таки сводится к изменению самой "транзакции", т.е. способа обработки данных в описанной выше ситуации.
26 май 09, 17:52    [7230703]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Здравствуйте pkarklin. Я помню Вас по первым 6-и страницам, которые у меня хватило терпения прочитать. После я перескочил в конец (тогда это была стр. 14)

Вы действительно повторяете свои предыдущие посты.
У меня впечатление что все здесь читают 2-3 последних поста и всё.

Как мне кажется, свою точку зрения я аргументировал и подкрепил примерами.
Можно Вас, pkarklin, лично попросить перечиталь мои посты с 14й по 16ю страницы?
(я не знаю, как показать прямой линк на первый мой пост)

Может я смогу тогда услышать аргументированные ответы, возражения и, если у Вас будет ещё желание, смогу ответить на ваши вопросы.
26 май 09, 18:46    [7230978]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
martin_bishop
Здравствуйте pkarklin.


Приветствую Вас!

martin_bishop
Как мне кажется, свою точку зрения я аргументировал и подкрепил примерами.


Да, более чем:

martin_bishop
Не должен нижний слой решать за верхний откатывать ли всю транзакцию целиком.


martin_bishop
Может я смогу тогда услышать аргументированные ответы, возражения и, если у Вас будет ещё желание, смогу ответить на ваши вопросы.


Гм... Как мне казалось, я уже несколько раз, и как мне казалось, аргументированно, пытался "отстоять свою позицию". Каких аргументов Вам еще надо?

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

Я же говорю о другом. "Моя бд" предоставляет всем, кто "ее пользует", скажем так, некий набор "сервисов", гарантирующих при их использовании корректность и непротиворечивость информации в бд, вне зависимости от "разумности" того, кто использует этот сервис.

У Вас же все наоборот, Вашему мастеру помешал какой-то триггер. Вот только интересно, зачем кто-то писал этот триггер? М.б. "это жжжж... не спроста"? Именно это я пытался донести в предыдущих своих постах.
26 май 09, 20:30    [7231273]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Штото жизнь пошла по кругу.
Снова "вложенные транзакции", "кто кем рулит", путаница между "ошибкой" и "изменённой логикой" и т.д.
Аж скучно.

-------------------------
There’s no silver bullet!
26 май 09, 22:04    [7231517]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Ах, да.
И, разумеется, обычное удивленияе "а что, МС такое умеет?" и стандартный ответ "ну да, еще с версии ХХХ" (в данном случае, ЕМНИП, не с 2000, а с 6.5. как минимум).

-------------------------
There’s no silver bullet!
26 май 09, 22:05    [7231520]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
martin_bishop
Вы действительно повторяете свои предыдущие посты.
У меня впечатление что все здесь читают 2-3 последних поста и всё.
Нет, обычно читают больше, но всегда найдется аффтар, из которого прет поток разума. На этом топик или умирает, или переходит в "не ту степь".
26 май 09, 23:56    [7231757]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Ладно, я понял, что наступил на вопрос веры ... :-J

To locky: я не говорил, что возможность появилась с 2к. Я сказал, что с 2к её пользуюсь

Напоследок только повторю свой вопрос.
Вот кусочек кода:
INSERT T(A) VALUES(-1);
select @er=@@error, @rc=@@rowcount, @message='INSERT T(A) faild!'
if @er <> 0 goto to_try_another_way_T

Вот 2 варианта привратника на таблице T:
- "умный" триггер, который роллбэчит транзакцию
- CHECK (A > -1)

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

Правильно ли это?
27 май 09, 00:03    [7231775]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
SQLMantis
Ясно что с commit по 1000 записей будет быстрее, но заворачивание в транзакцию тут предлагается ради скорости.


Кстати НЕ МНОЙ.

Вот пост

softwarer
Кудряшка
Мое персональное скромное мнение по теме дискуссии: если в транзакции возникла ошибка - ее надо откатить и точка.

Угу. Вот идёт, например, ETL на скромный такой 1'000'000 записей. На 990'000-й возникла ошибка - надо всё нахрен откатить, и точка.


В котором, как я поняла, уважаемый softwarer со мной не согласен. И в его посте явно предполагается (в свете дискуссии), что весь мильйон в одной транзакции. И в этой одной транзакции, как он считает 1 глючная запись может выдать ошибку, но это ничего, все остальные записи должны попасть в базу.
Выделенное - это бизнес логика, которая (лично мне) четко дает понять, что каждая из мильйона не зависит по бизнес-логике от остальных. Из чего следует - не должны они быть в одной транзакции!

Про далее написаное о "флагах"... смешались люди, кони... в общем pkarklin уже ответил.


SQLMantis
Кудряшка же говорит о том что если внесение всего лимона записей - суть одна транзакция (отсутствие хоть одной нарушит бизнес-логику), логично завернуть все это хозяйство в одну транзакцию, следуя принципу либо все либо ничего.


ДА. (изначально, как этот пример был приведен, говорится нечто типа "е-майо, у нас весь мильйон в одной транзакции, но нам почему-то на самом деле надо обработать этот мильйон так, как будто каждая запись из миллиона в своей собственной транзакции").


Далее softwarer пишет
softwarer

Выполнить массовую операцию (SQL-операторы) с миллионом записей - обычно куда быстрее, нежели выполнять его миллион раз для каждой записи. Запустить хранимку для обработки миллиона записей - обычно куда быстрее, чем вызвать её миллион раз по одной записи.


Так Вы все-таки делаете массовую вставку? Т.е. вставляется набор данных и одна запись из набора дубликат - в этом случает сервер вообще ничего не вставит в таблицу. Ни одной из миллиона. Или я что-то из новшеств пропустила?

Пример массовой вставки. SQL Server Enterprise Edition 2005 SP3 (build 9.0.4035).
create table #T (pName varchar(25))

create table #NewT 
(Id int identity (1,1), 
	pName varchar(25), 
 CONSTRAINT [UX_Name] UNIQUE NONCLUSTERED 
(
	pName ASC
))

insert into #T (pName) -- допустим эта табличка - некий recordset в ETL процессе
select 'test1' union all
select 'test2' union all
select 'test3'


insert into #NewT (pName) -- допустим эта табличка - табличка БД, которая уже содержит некие данные
select 'test3' union all
select 'test4'

BEGIN TRAN
	INSERT INTO #NewT (pName)  -- это некая операция в транзакции, пишу ее здесь для того, чтобы продемонстрировать, что COMMIT выполнится
	select 'test10'
	--
	INSERT INTO #NewT (pName)  -- пытаемся вставить весь рекордсет (не по одной записи), что бьет нам ошибку
	SELECT pName FROM #T 

COMMIT

select * from #NewT  -- ничего сюда не вставилось из таблицы #T!!! 

drop table #T
drop table #NewT
--------------------------------------------------------------------------------------
Id          pName
----------- -------------------------
1           test3
2           test4
3           test10

(3 row(s) affected) -- что в таблице после COMMIT

По моему мы уже не только ходим по кругу, но и пытаемся пудрить друг другу мозги... :(
27 май 09, 04:26    [7231940]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
martin_bishop
Gluk (Kazan)

Ооо ... MS SQL научился откатывать вложенные транзакции ???


с 2000 версии этим пользуемся.
Это не полноценная вложенность как в Оракле, но позволяет откатить-сохранить внутреннюю, не трогая наружной (транзакции хозяина, так сказать)


Продемонстрируйте на 2000 если Вас не затруднит
27 май 09, 07:31    [7231997]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
softwarer
Мне кажется, здесь путаются понятия вложенных и автономных транзакций. Мм.. давайте чуть набросаем, как я понимаю.

1. Что такое транзакция, мы предположительно знаем и понимаем.

2. Вложенная транзакция - транзакция, выполняемая как часть внешней. Она может сама по себе откатиться, и внешняя может после этого продолжить работу, но если вложенная получила commit - реальный commit/rollback этих изменений определяется внешней транзакцией.

3. Автономная транзакция - независимая транзакция, исполняемая "по ходу" основной, её commit сохраняет данные даже после rollback вызвавшей.

4. Вложенная транзакция в общем похожа на savepoint со строгим соблюдением парности.

В Oracle, насколько я знаю, полноценных вложенных транзакций нет. Есть автономные, а savepoint-ы идут с некоторыми ограничениями (скажем, нельзя изменить установки set transaction), да и синтаксис требует if-ов, чтобы использовать код и как независимую, и как вложенную транзакцию.


дополню:

5. rollback вложенной транзакции не должен откатывать основную транзакцию

И ... счетчик транзакций лучше не вспоминайте. К вложенным транзакциям он отношения не имеет, сто раз перетиралось
27 май 09, 07:38    [7232000]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
SQLMantis
Gluk (Kazan)
SQLMantis
Кудряшка же говорит о том что если внесение всего лимона записей - суть одна транзакция (отсутствие хоть одной нарушит бизнес-логику), логично завернуть все это хозяйство в одну транзакцию, следуя принципу либо все либо ничего.


Принципы закончаться на первой же практической заливке данных
Принципы - это излечимо


Опять не о том.


О том, о том
Все ваши принципы пойдут лесом, как только понадобиться залить лям записей (что в Oracle, что в MS SQL)
27 май 09, 07:40    [7232001]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky
Ах, да.
И, разумеется, обычное удивленияе "а что, МС такое умеет?" и стандартный ответ "ну да, еще с версии ХХХ" (в данном случае, ЕМНИП, не с 2000, а с 6.5. как минимум).

-------------------------
There’s no silver bullet!


Ога, счетчик вложенных транзакций - серебрянная пуля адназначна
savepoint-ы кстати тоже не совершенны
27 май 09, 07:43    [7232002]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Nikolay Kalmarskiy
Member [заблокирован]

Откуда: Матф.7,19
Сообщений: 4083
Gluk (Kazan),

В оракле, как раз

INSERT --+ APPEND PARALLEL(A, 8)
INTO TABLE SHIT_TAB A
FROM SELECT * FROM SHIT_DRAFT_TAB B


превосходно зальёт лям записей в таблицу SHIT_TAB одной транзакцией.
27 май 09, 07:55    [7232010]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 11 12 13 14 15 [16] 17 18 19 20 .. 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить