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

Здравствуйте, друзья!

Пользуюсь Access-Excel, для синхронизации справочных данных из одной базы Access во многих файлах Excel. Такое самодельное MDM (master data management).
Вся эта "красота" с выпадающими каскадными списками (зависящими от предыдущего значения в записи), пока работала без VBA.
Таблицы подключаются с помощью Подключения к внешним данным на вкладке Данные в Excel, через файл .odc, в котором содержится строка подключения:

Provider=Microsoft.ACE.OLEDB.12.0;User ID=Admin;Data Source=f:\Общая\DWH\DWH.accdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Engine Type=6;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass UserInfo Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False

Таблицы обновляются вручную, после нажатия Обновить всё. С поля Обновлять при открытии, я флажок убрал.
При обновлении база Access блокируется, появляется файл .laccdb.
Блокировка снимается только после того, как пользователь закроет файл Excel, который он обновил.
Таким образом другой пользователь не может обновиться, пока открыт файл предыдущего обновившегося пользователя.

Вопрос в следующем:
Можно ли на событие, например, после ActiveWorkbook.RefreshAll повесить процедуру снятия блокировки базы Access.
Ответ: Анатолий ( Киев ),

Вариант, о котором вы пишете нашел сам, но он возвращает только записи, без полей, и не отформатированные как таблица.
Он не подходит, поскольку использую именованные диапазоны, на которых работают выпадающие списки в Excel.

avng, подсказал следующее:



Это дает нужный результат.

Сорри за кросспостинг, не знал к какой теме лучше отнести вопрос: Access или Excel.
А два раза в Access из-за флуда товарища 2112.
Вопрос: Блокировка записей от чтения

В PostgreSQL реализована модель когда читающие транзакции не блокируют пишущие.
Как организовать в таком случае блокировку от чтения определенного набора строк в таблице, на то время пока другая транзакция их прочитала и пишет в таблицу? Или я просто не совсем понял смысл работы "версионного механизма".
Ответ:
qwwq
Тимошенко Александр,

вас на 4 буквы послать ?

посылаю
оттуда сами можете все раскопать, например вот это

и потихоньку, кирпичик за кирпичиком -- жызнь и наладиццо


Ну раз уж послали, тогда ок, спасибо отзывается:)
Вопрос: блокировка чтения - в каком серванте можно ее исключить ?

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

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

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

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

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

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.
Вопрос: Как перестроить индексы без блокировок транзакций?

Коллеги, привет!

Система работает 24x7. Необходимо перестроить (rebuild) индексы по таблице. При этом не должны идти блокировки на изменение в таблице, где присутствуют данные индексы.

Поискал информацию по данной теме. Нашел только, что rebuild индексов можно делать с хинтом online=on.
Самое интересное, что на базе разработки с таким же наполнением, выполняя перестройку индексов, добавляю данные в эту таблицу и блокировки не появляются, но на прод среде сразу появляются блокировки.
Не могу понять почему такая причина.

Инстанс 2012
Объем таблицы 10 млн.
Ответ:
Genniy
Спасибо, ребята, за быстрый ответ.

Еще быстрее ответы получаются при самостоятельном чтении хелпов
Вопрос: Посоветуйте базу, много операция удалений и вставок.

Входные данные:
1) Сервер любой (не имеет значение, т.е. будет куплен любой по необходимости)
2) Таблица содержит до 100 тыс. записей. Это правда немного, но все записи находятся в ПОСТОННОМ режиме вставки, чтения, удаления.
3) Каждую секунду к БД идет соединений: 400-800шт. Одно обращение это:
UPDATE ... SET `process_id` = '_X_' WHERE `process_id` = '' LIMIT _N_; SELECT ... WHERE `process_id` = '_X_'
.
Если кто-то не понял логики, объясню: так делается для того, чтобы одну и ту же запись не могли получить одновременно два разных соединения.
4) Через некоторое время (3-5 сек.):
DELETE ... WHERE `id` = '_ID_'
(каждая запись имеет уникальный идентификатор `id`)

Вопрос: какую БД лучше использовать?
Может быть есть какой-то другой алгоритм контроля, чтобы одну строку могло прочитать (использовать) только одно соединение?

P.S. Пробовал на MySql с таблицей типа InnoDB с индексами на `id` и `process_id`. До 5 тыс. записей в таблице молниеносно все работает. Но если записей становится около 20 тыс. в статусе операций БД видно много запросов с ожиданием "wite lock".

Видимо 300 (примерное число) одновременных соединений, выполняя UPDATE мешают друг другу и ждут окончания каждого. Если соединений еще больше, и записей больше происходит, что то похожее на "deadlock" - но все же не "deadlock", со временем операции все завершаются, но из-за медленного выполнения, количество одновременных соединений увеличивается, что и вызывает потерю памяти и еще больше блокировок (количество открывающихся соединения растет, а выполненных и закрывающихся падает).а завершающихся падает.

P.S. P.S.
Как вариант - запретить подключение к базе более 800 соединений. Этот вариант я рассмотрел и мне он не подходит. Просто каждую минуту соединения не будут открываться с ошибкой "max connect" - это не решение. Каждую секунду они должны как открываться, так (через равные промежутки времени) и закрываться (как было бы, если бы не было блокировок).
Ответ:
Можно и базу если нагрузка не слишком велика. Но всё равно по скорости чистой записи с
плоским файлом ничто не сравнится.

Posted via ActualForum NNTP Server 1.5

Вопрос: skip locked без блокировки

Добрый день.

Суть задачи такая.
Есть два независимых процесса.
Первый в цикле партиями выгребает записи из таблицы select for update limit skip locked и изменяет их.

Второй процесс должен запросить записи из этой же таблицы только для чтения, но пропустив записи, заблокированные первым процессом.
Т.е. как бы skip locked, но без for update

Суть в том, что если эти два процесса сработают одновременно(что может быть), то процесс только чтения залочит записи и процесс обновления их пропустит, что как раз нужно исключить.

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

Заранее благодарю.
Ответ: Antipich,

На сколько мне известно PostgreSQL версионник.
Зачем из версионника делать блокировочника, не понятно.

Люди столько человеко-часов положили, чтобы блокировок было как можно меньше.
И чтение не блокировала таблицу.

Может для вашей задачи взять другой инструмент, где такое поведение было бы by default?
Вопрос: Помогают ли некластерные индексы с include от блокировок?

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

Подскажите действительно некластерные индексы с включенными столбцами(чтобы покрывали запросы) могут помочь от блокировок хоть в каком-то случае?

В случае X блокировки диапазона значений ключа с таблице, в некластерном индексе(если он есть) этот диапазон тоже блокируется или нет?
Ответ:
b_Yury
Верно ли я понял что в этом случае если не будет некластерного индекса будет блокировка и ожидание, а если будте некластерный индекс то из него пройдет чтение и ожидания не будет?
Вы как-то туманно изъясняетесь. Если имеется в виду способ обхода несовместимой блокировки в некоторых случаях, то да.
b_Yury
а include для этого обязателен в этом некластерном индексе? или достаточно чтобы в состав некластерного индекса входили все читаемые столбцы без include
Главное - наличие столбца в индексе. Откуда считывать его значение - из ключа или из include-столбцов - не важно.
Если столбец будет использоваться для поиска по индексу - то он должен быть в ключе.

Если вы таким экстравагантным способом собираетесь решать конфликты читателей и писателей - то индексов не напасетесь на все случаи жизни.
Сами же писали, что работаете на RC. Ну так включите RCSI и не занимайтесь ерундой.
Вопрос: Подскажите по блокировке..

Здравствуйте.
Сегодня словили блокировку со 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
Вопрос: Опять о блокировках

Прошу помочь новичку, с 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, загружен слабо.