Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизАпологетам "MS SQL Server" - что там с блокировками записей? Найти похожие ветки
← →
Курдль © (2004-04-30 13:21) [0]Как с ними бороться. Я имею в виду отказ сервера в выборе записей, когда кто-то открыл транзакцию на изменение.
← →
Ega23 © (2004-04-30 13:25) [1]ISOLATION LEVEL поменять
← →
Курдль © (2004-04-30 13:29) [2]Я уже недавно это слышал и на время даже заткнулся со своими воплями, что oraсle - the best!. Но не хило бы предупреждать непосвященных, чем это грозит!
← →
Ega23 © (2004-04-30 13:33) [3]В смысле?
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
← →
Курдль © (2004-04-30 13:35) [4]
> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
А не попахивает ли это "грязным чтением"? :)
← →
clickmaker © (2004-04-30 13:41) [5]select что-то from таблица with (nolock)
← →
Ega23 © (2004-04-30 13:50) [6]А не попахивает ли это "грязным чтением"? :)
Оно и есть. Есть и другие уровни :-) Это я так, для примера из SP-хи одной выдрал.
select что-то from таблица with (nolock)
Тоже вариант.
← →
Курдль © (2004-04-30 13:51) [7]Пример бизнес-процесса.
1. ЮЗЕР1 открыл транзакцию, создал запись в ТАБЛИЦЕ1 и начал заполнять ее данными.
2. ЮЗЕР2 открыл транзакцию и начал заполнять ТАБЛИЦУ2, в частности - выбрал из нее последнюю появившуюся запись из ТАБЛИЦЫ1 (ту самую, которую тока что внес, не закоммитив, ЮЗЕР1).
3. ЮЗЕР1 задолбался заполнять и сделал CANCEL (ROLLBACK).
Ваши прогнозы, плз.
← →
Polevi © (2004-04-30 13:51) [8]>Курдль © (30.04.04 13:35) [4]
в Oracle нет блокировок ?
← →
clickmaker © (2004-04-30 14:06) [9]
> Курдль © (30.04.04 13:51) [7]
Дык надо учитывать ситуации, в которых можно грязно читать, а в которых нет. Искать компромисс: слишком высокий уровень транзакций при большой загруженности может приводить к deadlock"ам, слишком низкий - к недостоверности данных.
Если транзакции относительно длинные, то лучше хинты update таблицу with (rowlock) внутри них юзать. А вообще стараться короче их делать
← →
Ega23 © (2004-04-30 14:07) [10]1. ЮЗЕР1 открыл транзакцию, создал запись в ТАБЛИЦЕ1 и начал заполнять ее данными.
Т.е. сначала был INSERT, потом, через какое-то время, Юзер1 захотел сделать UPDATE?
Но update ведь, как правило, не по ключевому полю идёт, а по информативным полям.
← →
Курдль © (2004-04-30 14:16) [11]
> Polevi © (30.04.04 13:51) [8]
> в Oracle нет блокировок ?
Нет.
> Ega23 © (30.04.04 14:07) [10]
> Т.е. сначала был INSERT, потом, через какое-то время, Юзер1
> захотел сделать UPDATE?
Нет.
Предположим, что в момент t1 сделал INSERT а в момент t2 сделал ROLLBACK, но именно между этим, возможно даже очень малым промежутком времени, ЮЗЕР2 и сделал своё черное дело - получил ID записи из ТАБЛИЦЫ1 для своего зловещего внешнего ключа.
← →
roottim (2004-04-30 14:18) [12]в этом то и сложность, которую многие не могут понять, что универсального решения для всех баз нет... многие мсскл-ки пытаются перейти на оракле с малой кровью .. эээ не получиться... временные таблицы, блокировки, и многое что другое организовано по разному...
вообще 1-й том тома кайта (эх как тафтологично :)) думаю дал бы представления по разнице подходов..
для оракле любая транзакция по длительности есть гуд , то биш нет проблем...
для мсскл такое не пройдет.. нет версионности(многовариантности по т.кайту). здесь необходимы максимально короткие транзхакции, для многопользовательского режима. Нельзя делать так как в оракле - начал транзакцию.. пошел покурил... доделал.. закомитил.
для мсскл - это катастрофа... семеро - одного будут ждать..
а чтение грязных данных - это вообще приведет к краху.. особенно фин-систем
← →
Polevi © (2004-04-30 14:18) [13]>Курдль © (30.04.04 14:16) [11]
а кроме вас об этом ктонибудь знает ?
← →
DenK_vrtz © (2004-04-30 14:22) [14]>Курдль © (30.04.04 14:16) [11]
>> в Oracle нет блокировок ?
>Нет
Ты наговоришь! В документации этому аж целая главая посвящена.
Каких блокировок там только нет.
← →
Курдль © (2004-04-30 14:26) [15]
> Ты наговоришь! В документации этому аж целая главая посвящена.
> Каких блокировок там только нет.
Только нет таких, которые мешают работать с базой :(
Я вот все думал, откуда берутся программеры, у которых в голове всё какие-то временные таблицы или хуже того - трехзвенки. Оказывается - с MSSQL-я. :(
← →
Курдль © (2004-04-30 14:29) [16]
> roottim (30.04.04 14:18) [12]
> для оракла любая транзакция по длительности есть гуд , то
> биш нет проблем...
Если не считать, что он начинает дико жрать ресурсы.
← →
Ega23 © (2004-04-30 14:30) [17]Предположим, что в момент t1 сделал INSERT а в момент t2 сделал ROLLBACK, но именно между этим, возможно даже очень малым промежутком времени, ЮЗЕР2 и сделал своё черное дело - получил ID записи из ТАБЛИЦЫ1 для своего зловещего внешнего ключа.
Может я конечно чего-то недопонимаю, но разве в один момент времени могут обрабатываться сервером 2 разные транзакции?
← →
jocko © (2004-04-30 14:34) [18]>Как с ними бороться.
1. не открывать транзакции с клиента (есть такие любители)
2. сузить транзакции, т.е. не вычислять переменные внутри транзакций, не делать селектов внутри тран. (иначе на время выполнения тран. записи блокируются, и надо помнить еще про эскалации)
3. разбивать длинные транзакции (по возможности)
4. следить за тем, чтобы небыло прерываний timeout при вызове с клиента (это вообще полная ж...), или вовремя отслеживать и делать например, while @@trancount > 0 rollback tran, иначе эта гадость будет вообще висеть непонятное количество времени :-(
← →
roottim (2004-04-30 14:36) [19]>Если не считать, что он начинает дико жрать ресурсы.
это какие???... и при каких условиях ?
и всеже почитай тома.. со вкусом написано... и на понятном каждому уровне, думаю многие вопросы отпадут сами сабой...
← →
bushmen © (2004-04-30 14:47) [20]>Только нет таких, которые мешают работать с базой :(
Если блокировки мешают работе, то это уже зависит от программиста, который коряво пишет программы.
← →
Курдль © (2004-04-30 14:52) [21]
> Если блокировки мешают работе, то это уже зависит от программиста,
> который коряво пишет программы.
Если программист пишет программы с базами на "парадоксе", которые (как неоднократно здесь упомяналось) имеют свойство рушить собственные индексы, то это я называю "коряво писать программы". Т.е. как бы ни был хорош программист - рано или поздно юзер останется без данных.
← →
dimm22 (2004-04-30 14:59) [22]Сразу чувствуется, что пятница. Народ пофлеймить потянуло. Даёшь версионность всем БД !!!(Читать как Ibase, Oracle - cool; MSSQL- shit.)
← →
Polevi © (2004-04-30 15:17) [23]да макрософт вообще ацтой, виндовс масдай
даешь оркл на линуксе !
← →
Fay © (2004-04-30 16:43) [24]2Polevi © (30.04.04 15:17) [23]
В таких ответах принято ставить смайлики.
← →
Fay © (2004-04-30 16:46) [25]2Курдль © (30.04.04 14:26) [15]
Для такого ответа необходим скромный (и только!) опыт работы с Oracle и никакой с MSSQL.
← →
Nikolay M. © (2004-04-30 16:51) [26]
> jocko © (30.04.04 14:34) [18]
> вовремя отслеживать
> и делать например, while @@trancount > 0 rollback tran
Роллбэк из внутренней транзакции октатит все внешние транзакции тоже. Просто перед коммитом или роллбэком нужно проверять значение @@trancount. Но в цикле - ? Смысл?
← →
Fay © (2004-04-30 17:16) [27]Nikolay M. © (30.04.04 16:51) [26]
>> Но в цикле - ? Смысл?
В MSSQL есть такая фигня в процедурах - не всегда очевидно, какой @@trancount. Обычное дело при явном старте транзакции в процедуре.
← →
Nikolay M. © (2004-04-30 17:22) [28]
> не всегда очевидно, какой @@trancount
Можно пример, если не трудно?
Впервые слышу, что после ролбэка может быть @@trancount <> 0.
← →
Fay © (2004-04-30 17:30) [29]В таких ситуациях второй print может выдать нечто большее нуля.
print @@trancount
begin tran tran1
...
rollbact tran tran1
print @@trancount
← →
Nikolay M. © (2004-04-30 17:38) [30]Сейчас времени на эксперименты нет, но потом обязательно исследую этот вопрос. Хочешь сказать, что пкоа сервер освобождает ресурсы, схаванные транзакцией, он не выставит правильное значение @@trancount?
← →
Fay © (2004-04-30 17:57) [31]Когда я сам на такое нарвался, бяда проявлялась в том, что оставались открытые транзакции. С тех пор выходили всякие servicefuck-и, но я по сию пору пишу с циклом. 8)
← →
Nikolay M. © (2004-04-30 18:11) [32]
> С тех пор выходили всякие servicefuck-и
Так может в них уже проблема решена? Я, признаться, без SP4 на 2000-м даже и не работал...
← →
Fay © (2004-04-30 18:13) [33]У меня 4-ы ещё не установлен.Проверка временем не прошла.
Проверю на 3-м - любопытно стало. 8)
← →
Nikolay M. © (2004-04-30 18:25) [34]
> Проверка временем не прошла.
Why?
> Проверю на 3-м - любопытно стало. 8)
Жду-с :)
← →
Fay © (2004-04-30 18:49) [35]Это будет не сегодня. День не подходящий 8)
← →
Курдль © (2004-04-30 22:15) [36]
> Для такого ответа необходим скромный (и только!) опыт работы
> с Oracle и никакой с MSSQL.
Совершенно в точку! :(
А MSSQL вообще прозвучал в топике, для привлечения внимания (т.к. он младший брат Sybase - тоже, млин, "блокировщик").
Однако, мой скромный опыт работы с ораклом не принес ни одного разочарования. Ну, если не считать легкой SQL-ной недостаточности в 8-м и тяжелой - в 7-м. :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.035 c