Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Обновление невозможно; установлена блокировка

Форумчане,доброго времени суток!
впервые столкнулся со следующим: БД Аксесс 2003 зависла, пишется сообщение "обновление невозможно установлена блокировка"
В инете узнал, что такое может быть если в разделенной БД одновременно работают более 10 человек.
Насколько это верно?
Какие есть профилактические меры по предупреждению таких сбоев?
( не делать источником данных таблицы, а только запросы; применять временные таблицы и запросы на добавление в постоянные таблицы, поставить таймер на формы- если нет изменений какое-то время- то формы закрываются и т.д.)
Ответ: mobile, Так сделать не получится т.к. в конечной таблице установлен уникальный индекс (одну и ту же запись нельзя внести дважды). Я изменил источники данных обеих форм- вместо таблицы применил построитель запросов- со всеми полями таблицы. Пробовал- копирование, вставка+изменение проходит. Может просто совпадение.
Вопрос: Ошибка при сжатии базы 1222 (блокировка)

Здравствуйте у нас установлен Sql 2008 и 1с. Хотим сжать базу данных. Вечером выгнали всех пользователей отключили все регламентные задания. В интерфейсе SQL studio запустили команду сжатия базы он пишет ошибку 1222 (не удалось установить блокировку). Как посмотреть где еще используется база мы всех выгнали, все рег. задания отключили что ему еще нужно не понять?
Ответ: aa1799,

Посмотрите хотя бы в том же Activity Monitor на блокировки.
Вопрос: Транзакции и блокировки

Привет. Есть две транзакции:

T1 (запускается первой) всегда REPEATABLE READ
1) Обновление table_1
2) Запуск T2
2) Обновление table_2

T2
1) Создание темп. таблицы на основе table_1 и table_2 (JOIN)

Если T2:
1) READ UNCOMMITTED - дедлока не происходит.
2) REPATABLE READ - дедлок (T1 удерживает блокировку X на table_1, T2 удерживает блокировку S на table_2 и не дает T1 установить X блокировку на table_2)


Вопрос:
Почему в первом случае дедлока не происходит, а во втором происходит, ведь T1 удерживает блокировку X на table_1 в обоих случаях (не должна давать T2 создать темповую таблицу)?
Ведь известно, что X блокировка не дает возможности установить другие блокировки (ни S ни X).
С одной стороны, ответ на этот вопрос очевиден - READ UNCOMMITED позволяет читать не зафиксированные изменения, но с другой, как X блокировка это позволяет сделать?

В общем, в моей голове конфликтуют две темы, "транзакции" и "блокировки". Прочел массу материала, но исчерпывающей информации так и не нашел. Что я упускаю из всего этого?
Ответ: Почему в первом случае дедлока не происходит, а во втором происходит, ведь T1 удерживает блокировку X на table_1 в обоих случаях (не должна давать T2 создать темповую таблицу)?


Но транзакция T2 только читает данные, делает выборку, она не обновляет данные. Поэтому:

Если T2 имеет уровень изоляции READ UNCOMMITTED, то она может прочитать т. table_1 (по чтению эта таблица доступна, она не доступна по записи) и соединить ее с т. table_2, которая тоже доступна по чтению.

Если T2 имеет уровень изоляции REPEATABLE READ, то транз T2 пытается установить блокировки на таблицы table_1 и table_2, но они уже заблокированы транзакцией T1. Вот и происходит deadlock.
Вопрос: Блокировка записи через VBA посредством ADODB

Здравствуйте.
Всё в базе работает через VBA (Select, Update, формы и т.д.). Решил проверку записи на изменение сделать через блокировку посредством ADODB.Recordset. Создал глобальный рекордсет. Открывает и блокирует выбранную запись. При попытке со второй БД зайти на эту запись всё честно пишет, что запись заблокирована и вы не можете ее редактировать. Только проблема в том, что после этого невозможны никакие изменения в таблице, даже если перейдешь на незаблокированные записи. Есесвенно закрываю рекордсет как положено. Подскажите, что не так? Если же не наезжать на заблокированную запись, то все норм. Обе копии работают в штатном режиме. С DAO точно такая же проблема, тестировал.

Visual Basic
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
'Определяем глобальные переменные
Dim LockRST As ADODB.Recordset 
Dim LockCnn As ADODB.Connection 'Необходима чтобы открывать в пессимисте
 
'На открытие формы активируем
Set LockCnn = New ADODB.Connection
LockCnn.Open CurrentProject.BaseConnectionString
Set LockRST = New ADODB.Recordset
LockRST.ActiveConnection = LockCnn
LockRST.CursorType = adOpenKeyset
LockRST.LockType = adLockPessimistic
 
'Процедура блокировки в которую передают уникальный ID
 Private Sub CheckLockRecord(ByVal ID As Integer)
    Call FreeLockRST 'Вызываем процедуру очистки рекордсета
On Error GoTo ErrorHandler
    LockRST.Open "Select [Busy] From [Table] Where [ID] = " & ID 'Открываем запись. 
    If LockRST.RecordCount > 0 Then
        LockRST.Fields("Busy").Value = True 'Блокируем запись
    End If
    Exit Sub
ErrorHandler:
    'Если установлена блокировка
    LockRST.Close
    If Err.Number = -2147467259 Then 'На DAO 3218 что ли.
        MsgBox ("Данная запись уже заблокирована. Вы можете только просматривать ее.")
    Else
        MsgBox Err.Number & ": " & Err.Description 
    End If
End Sub
 
'Освобождаем Рекордсет
Private Sub FreeLockRST()
On Error GoTo ErrorHandler
    If Not LockRST Is Nothing And LockRST.State = adStateOpen Then 'Проверили на существование и открытие.
        LockRST.CancelUpdate 'Отменяем Update 
        LockRST.Close
    End If
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & ": " & Err.Description
End Sub
Перед любыми изменениями освобождаю запись посредством процедуры FreeLockRST. Все работает правильно, так как если не было наложений двух рекордсетов все апдейтится.
Ответ: YuryK, а что не ясно? пиши вместо своего adLockPessimistic свойство adLockOptimistic, таблица не должна блокироваться(молча) при обращении к ней других пользователей-см.выше у Андрэича
Вопрос: INSERT с последующей блокировкой строки. InnoDB

Добрый день

Есть простая таблица:

CREATE TABLE IF NOT EXISTS `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `any_data` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;



1)В таблицу нужно добавить (item_id,'any_data') и на добавленную запись сразу же установить блокировку изменения данных(как вариант FOR UPDATE).
2)Одновременно несколько клиентов пытаются добавить те же самые данные.

Пробовала так:

BEGIN;
LOCK TABLES items WRITE;

#Удостоверимся что данный client_id точно не был добавлен
#Если запись - пркращаем работу
#Если записи такой нету то продолжаем
SELECT * FROM items WHERE item_id=n LOCK IN SHARE MODE;

INSERT INTO items(item_id , any_data) VALUES(n , 'any_data_str');

#Блокируем запись
SELECT * FROM items WHERE client_id=n FOR UPDATE

#Дальше следует разблокировать таблицу, но тогда автоматически будет COMMIT
COMMIT;#???????
UNLOCK TABLES;#???????


Как после вставки строки заблокировать добавленную строку строку на запись разблокировав всю таблицу для остальных клиентов?

Спасибо
Ответ:
MasterZiv
Как после вставки строки заблокировать добавленную строку строку на запись разблокировав всю таблицу для остальных клиентов?

все проще.

После вставки в таблицу Innodb новые записи видны только вставившей транзакции, поэтому нужно просто начать транзакцию, вставить записи, получить их идентификаторы, заблокировать их если надо Select ... for update,
обработать данные и завершить транзакцию.

"одинаковые" данные нужно отсекать с помощью уникального ключа.


или insert for duplication key update если логика такая.... ну скажем идёт вставка данных сразу с нескольких источников(у меня было) и величина должна сумироваться, но не известно есть уже для заданого первичного ключа запись или есчё нету.

все делают инсерт + апдейт при дубле ключа.
Вопрос: Обновление PL/SQL

Всем, привет.
Подскажите как обновить PL/SQL.
Установлен PL/SQL 11-й версии. Закончился триал-период. Дали ключ от 9-й версии, сказали что он действует на все обновления программы. Установил PL/SQL 9-й версии, ключ успешно принят. При запуске выдает ошибку инициализации - но это понятно, клиент Oracle установлен 11 версии. Дальше в 9-й версии PL/SQL предлагается обновиться до 12-й версии. Скачиваю, устанавливаю, но ключ не принимает. В 11-й версии, кстати, тоже не принимал.
Ответ: Обращайтесь в тех. поддержку .
Вопрос: не могу установить MySQL Workbench

на сайте предлагается версия 5.6.27 (более ранних не могу найти), я ее скачал, но во время установки программа пишет, что не может найти некоторые файлы (см фото). но чтоб их установить я так понимаю, необходима установка Visual Studio 2013, но на мою ос позднее Visual Studio 2010 невозможно установить, т.к. у меня WinXP, как быть с установкой MySQL Workbench?

К сообщению приложен файл. Размер - 8Kb
Ответ: sandy55,

Ставьте более раннюю версию.
MySQL Workbench 6.1 supports earlier versions of Windows, including Vista
Вопрос: Подскажите по блокировке..

Здравствуйте.
Сегодня словили блокировку со spid = 27. LockType: TAB, LockMode: X

login_time этого процесса: 2018-08-19 совпадает с последним включением сервера
Смотрел так:
select min(login_time) from sys.dm_exec_sessions


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

Если я правильно рассуждаю, то что мог начать пытаться делать этот системный процесс с таблицей?
Мог он к примеру делать обновление статистики таблицы,в момент когда в ней удалялись/обновлялись данные и вызвать блокировку?
Ответ: MAULER,

Если интересно, то:

sp_who --информация о процессах
sp_who2 --информация о процессах, включая - какими другими процессами процесс блокирован (столбец BlkBy)
sp_who2 27 --информация о конкретном процессе, включая - какими другими процессами процесс блокирован (столбец BlkBy)
--время исчисляется в миллисекундах, место на диске в байтах

declare @table_variable table (spid int,[Status] nvarchar(40),[login] nvarchar(60), hostname nvarchar(40),[BlokedBy] nvarchar(20), DBName nvarchar(40), Command nvarchar(40),CPUTime int, DiskIO int, LastBatch nvarchar(255), ProgramName nvarchar(255), SPID2 int, RequestID int) 
insert into @table_variable exec sp_who2
select spid, Status,login,hostname,BlokedBy,DBName,Command,CPUTime, CONVERT(int,CPUtime)/60000 as CPUTimeMin, DiskIO as DiskIOBytes,LastBatch,convert(int,SUBSTRING(LastBatch,1,2)) as Month,  convert(int,SUBSTRING(LastBatch,4,2)) as Day, ProgramName,SPID2, RequestID
from @table_variable
--where login<>'sa' 
order by convert(int,SUBSTRING(LastBatch,1,2)) Desc,  convert(int,SUBSTRING(LastBatch,4,2)) Desc, CPUTime desc



dbcc inputbuffer(27)-- просмотр кода запроса, выполняемого процессом

sp_lock	-- просмотр списка блокировок
select * from sys.dm_tran_locks -- просмотр списка блокировок
--типы блокировок
-- S   - разделяемая
-- X   - исключительная
-- IS  - разделяемая блокировка с намерением 
-- IX  - исключительная блокировка с намерением 
-- SIX - разделяемая блокировка с намерением исключительного доступа

DBCC opentran() --для конкретной базы данных - просмотр активных транзакций


--Кто использует базу tempdb
go
use tempdb
go
--список таблиц
select *
from sys.tables
order by create_date asc
--список сессий, не завершивших работу с tempdb
select s.*, internal_objects_alloc_page_count-internal_objects_dealloc_page_count as using_pages_tempdb,e.login_time,e.login_name
from sys.dm_db_session_space_usage as s
inner join sys.dm_exec_sessions as e
on s.session_id=e.session_id
where internal_objects_alloc_page_count-internal_objects_dealloc_page_count>0
--список активных транзакций
select transaction_id
from sys.dm_tran_active_snapshot_database_transactions
order by elapsed_time_seconds desc
Вопрос: блокировка чтения - в каком серванте можно ее исключить ?

Приветствую. С годом Белого Филина всех нас.

Вопросы:
1/ Мне нужно понять как правильно сделать базу хранения и обновления прайсов (один прайс - одна таблица,кол_во полей разное но основные одни и те же, сборка юнионом, прайсов около сотни). Сейчас все крутиться на MSSQL но я имею серьезные проблемы с блокировками чтения - я не всегда могу обновить прайс в нагруженной среде. Есть ли в настройках кагонить сервера возможность снять блокировку чтения - прайсы обновляю вручную, автоматом и :) снова вручную когда на той стороне снова поменяли формат, но постоянно - от этого зависит конкурентная способность организации.
2/ к прайсам народ подбирается из MSAccess (кроме вебинтерфейса). Требуют возможность оставлять заметки для себя - временные. Ну и прочие хотелки. У серванта должна быть возможность вещать на вьюхи триггеры "вместо обновления" - хороший способ сделать обновляемым любой не обновляемый вью.
3/ почему-то интересно: MSSQL "хранит" базу в двух файлах .mdf(база) и .ldf(лог) - удобно: работаешь на домашнем, отэтачил, кинул на флеху, приэтачил в другом серванте....важно !!!.
Ответ: SangYong,

даже в этом случае при чтении данных блокировка shared снимается сразу же после чтения одной страницы данных.
Также специально для того, чтобы select не мешал update-ту есть "ворота" для select -ов на таблице в виде update intent lock - несколько скелетов через нее проходят, потом"воротики закрываются" и select ы блокируются и не мешают update -у.

так что тебе надо что- то в консерватории поправить. в смысле, ты что то делаешь совершенно не так.
Вопрос: Опять о блокировках

Прошу помочь новичку, с MS SQL только что начал работать. Есть большая (~100000000 строк ), хорошо индексированная таблица Z, из которой постоянно происходят большие, параллельные выборки с "грязным" чтением - SELECT a,b, c...FROM Z WITH(NOLOCK). Параллельно также происходит обновление таблицы Z. Ну, а далее "превышено время ожидания блокировки". Естественно, что blocking_session_id равно одной из сессий выборки. Почему, ведь чтение "незакомиченное"? И что делать?
Понимаю, что подобные вопросы уже плешь проели, в литературе тоже копал, но не поясните ли еще раз почему при данных выборках блокируется обновление.
Ответ: Всем спасибо за ответы. К сожалению, так и не понял , в чем дело. Сейчас несколько оптимизировал запросы и взаимоблокировки прекратились, хотя блокировки остались. Буду думать.
Да, естественно пользовался sys.dm_exec_requests, sys.dm_exec_sessions и т.д.
Кстати, относительно ресурсов сервера - 2008 R2 Ent, 32/64, загружен слабо.