|
v7: Таблица 1SJOURN SQL | ☑ | ||
---|---|---|---|---|
0
alexandr_87
05.03.15
✎
22:08
|
Убрал табллок на таблицу журнала, вопрос к чему это может провести???
Плюс в том что при вводе нового документа даже если кто-то проводит другой документ не выскакивает "time out expired..." |
|||
1
zulu_mix
05.03.15
✎
22:14
|
увеличить таймаут на скуле не предлагать?
|
|||
2
alexandr_87
05.03.15
✎
22:16
|
так это ничего не даст, увеличит время ожидания пользователя, а тут нужна оперативность...
|
|||
3
vde69
05.03.15
✎
22:21
|
коллизии при одновременной записи одного обьекта
Петя открыл док 1, установил 200р Вася открыл док 1, установил 300р Петя записал и закрыл док Вася записал и закрыл док как Вы думаете что будет думать Петя об сумме документа? |
|||
4
Sorm
05.03.15
✎
22:26
|
(3) Что Петя будет о Васе - гораздо важнее:)
|
|||
5
alexandr_87
05.03.15
✎
22:28
|
tabllock я снял только с 1sjourn а из хранимой процедуры самого документа оставил, если петя открыл док1 то вася не сможет его открыть
|
|||
6
Serg_1960
05.03.15
✎
22:31
|
Хуже то, что Петя и Вася могут не думать о сумме до тех пор, когда станет уже поздно думать. "Трясти надо!"(с)
|
|||
7
vde69
05.03.15
✎
22:48
|
(5) догадайся какие документов поля хранятся в общем журнале :)
а вообще конечно нужно думать о транзакциях в целом, в том числе и о грязном чтении в чужой транзакции... |
|||
8
zulu_mix
05.03.15
✎
22:49
|
(7) вся шапка кроме проведения
|
|||
9
Z1
05.03.15
✎
22:54
|
(0, 2)
Это как в анекдоте -А можете печатать 1000 знаков в минуту -Могу.Но такая х получается. Если одним словом то как в 0 делать нельзя. Если как бы убираешь блокировки стандартные то вместо них надо ставить свои блокировки |
|||
10
Z1
05.03.15
✎
22:57
|
(3) Что-то не то говоришь.
Два пользователя не могут открыть один документ на редактирование. за это отвечает файловая блокировка. А вот если при 0 будут проводиться два документа и они одновремено полезут к одним итогам (таблицы rg ) по регистрам то итоги "полетят" |
|||
11
alexandr_87
05.03.15
✎
22:59
|
на таблице "проводки" есть блокировка,уже проверял запустил проведение одного документа,в это время записал другой без пробел а вот провести не пропускает "Блокировка таблицы Проводки".
|
|||
12
Z1
05.03.15
✎
23:00
|
Но ситуация (3) тоже может быть плачевной если
действия (3) делать не итерактивно а программно через СоздатьОбъект |
|||
13
alexandr_87
05.03.15
✎
23:01
|
надо еще много разных тестов,провести....
|
|||
14
Z1
05.03.15
✎
23:02
|
(11) причем тут проводки у тебя полетят итоги по бух проводкам
и обороты по бух проводкам.название таблиц не помню но могу посмотреть. (11) ты понимаешь полностью что написано в (10) если нет то верни лучше все обратно |
|||
15
Z1
05.03.15
✎
23:04
|
(13) удачи ...
Особенно если будешь делать на белой бух базе и по этой базе сдашь декларацию по новой форме 2015. |
|||
16
alexandr_87
05.03.15
✎
23:08
|
пока все в тестовой, ты имеешь в виду что будут записаны не правильные данные в таблице проводок?
|
|||
17
Z1
05.03.15
✎
23:15
|
(16) В тестовой у тебя все будет идеально ты же в ней один работаешь.
В рабочей все будет грустно. проводки будут правильно в любом случае записаны и в рабочей базе но помимо проводок есть итоги, обороты и.т.д. |
|||
18
alexandr_87
05.03.15
✎
23:29
|
Дело говоришь:). Вот бы узнать как софт пойнт гибкие блокировки использует....
|
|||
19
ADirks
06.03.15
✎
08:13
|
(18) Так у них на сайте всё расписано. По крайней мере было раньше. Вместо tablock используют rowlock, только и всего :)
|
|||
20
torgm
06.03.15
✎
08:17
|
(0) есть компонента toysql позволяет блокировки снимать правильно, к ней дополнительно набор скриптов, у ставил трем клиентам, полет нормальный
|
|||
21
vde69
06.03.15
✎
08:36
|
я вообще не понимаю зачем это делать?
при штатных настройках 7.7 вполне тянет по сети 15 человек фигачавших документы..... разумеется если код не кривой... |
|||
22
VladZ
06.03.15
✎
08:48
|
(0) Зачем? Найди код, который всех вешает и оптимизируй.
|
|||
23
Z1
06.03.15
✎
09:19
|
(19) так просто.
но на некоторых наборах данных (или из-за особенностей документов) такое решение может приводить наоборот к взаимоблокировкам. Пример попробуйте при таком решении подгрузиться из УРБД. |
|||
24
mvk
06.03.15
✎
09:30
|
Привет. Не мое. Точнее частично. К сожалению не помню автора - давно это было.
К этому еще можно пользовательские блокировки прикрутить. // Код для отключения блокировок Function XOR(Val ParA, Val ParB) Res = 0; Koef = 1; For BitNumber = 1 To 8 Do BitA = ParA % 2; BitB = ParB % 2; ParA = Int(ParA / 2); ParB = Int(ParB / 2); BitC = (BitA + BitB) % 2; Res = Res + BitC * Koef; Koef = Koef * 2; EndDo; Return Res; EndFunction // индексы значений с списке // server = 2, db = 4, uid = 6, pwd = 8, checksum = 10 Function ConnectionString() export Var SQLKeyCode[36], ConnectCode[200]; ConnectFile = IBDir() + "1Cv7.DBA"; If FS.ExistFile(ConnectFile) = 0 Then Message("Это не SQL - база!", "!"); Return (0); EndIF; FSO = CreateObject("Scripting.FileSystemObject"); F = FSO.OpenTextFile(ConnectFile, 1); ConnectLen = 0; While F.AtEndOfStream = 0 Do ConnectLen = ConnectLen + 1; ConnectCode[ConnectLen] = Asc(F.Read(1)); EndDo; F.Close(); FSO = 0; SQLKey = "19465912879oiuxc ensdfaiuo3i73798kjl"; For i = 1 To 36 Do SQLKeyCode[i] = Asc(Сред(SQLKey, i, 1)); EndDo; Connect = ""; For i = 1 To ConnectLen Do Connect = Connect + Chr(XOR(ConnectCode[i], SQLKeyCode[(i - 1) % 36 + 1])); EndDo; vl=createobject("ValueList"); Connect=StrReplace(Connect,"{",""); Connect=StrReplace(Connect,"}",""); vl.fromSeparatedString(Connect); return (vl); EndFunction procedure patch_xp(check_error=0) if ExclusiveMode()=0 then if FS.ExistFile(IbDir()+"1cv7.dds")=1 then constr=ConnectionString(); if ConStr<>0 then server=constr.getValue(2);database=constr.getValue(4);uid=constr.getValue(6); pwd=constr.getValue(8); con=createobject("ADODB.Connection"); con.cursorlocation=3; err=""; con.open("provider=SQLOLEDB;data source="+trimall(server)+";DataBase="+trimall(database)+";uid="+trimall(uid)+";pwd="+""+trimall(pwd)); qwerty=" |alter procedure _1sp__1SUIDCTL_GetMaxID(@tid INTEGER, id CHAR(9) OUTPUT) AS |select id=MAXID from _1SUIDCTL(UPDLOCK) where TYPEID=@tid |if id is null select id=' '"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов документов и справочников..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |alter procedure _1sp__1SENTRY_MaxRowID(i INTEGER OUTPUT) AS |set nocount on |select i=@@IDENTITY |if i is null select i=0"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов проводок..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |alter procedure _1sp__1SOPER_MaxRowID(i INTEGER OUTPUT) AS |set nocount on |select i=@@IDENTITY |if i is null select i=0"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов операций..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |alter procedure _1sp__1SCONST_MaxRowID(i INTEGER OUTPUT) AS |set nocount on |select i=@@IDENTITY |if i is null select i=0"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнена модификация счетчика идентификаторов констант..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; try qwerty=" |ALTER procedure _1sp__1SCONST_TLockX AS |return"; con.execute(qwerty); qwerty=" |ALTER procedure _1sp__1SCONST_TLock AS |return"; con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы констант..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; try qwerty=" |ALTER procedure _1sp__1SENTRY_TLockX AS |return"; con.execute(qwerty); qwerty=" |ALTER procedure _1sp__1SENTRY_TLock AS |return"; con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы проводок..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; try qwerty=" |ALTER procedure _1sp__1SOPER_TLockX AS |return"; con.execute(qwerty); qwerty=" |ALTER procedure _1sp__1SOPER_TLock AS |return"; con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не отключена блокировка таблицы операций..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; try qwerty="select name from sysobjects where name='u_1ssystem'"; rs= con.execute(qwerty); if rs.recordcount()=0 then qwerty=" |create trigger u_1ssystem on _1ssystem for update as |set nocount on |if update(eventidta) |begin | declare @UserAccess as char(16) | select @UserAccess = |cast((SELECT DATABASEPROPERTYEX(db_name(), 'UserAccess')) as char(16)) | if (@UserAccess='MULTI_USER') Or @UserAccess='RESTRICTED_USER' | begin | IF EXISTS(select * from inserted i, deleted d where | d.curdate > i.curdate | or (d.curdate = i.curdate and d.curtime > i.curtime) | or (d.curdate = i.curdate and d.curtime = i.curtime and d.eventidta > i.eventidta) | ) | BEGIN | update _1ssystem with (updlock) |set curdate = d.curdate, curtime = d.curtime, eventidta = d.eventidta |from deleted d | END | end |end"; con.execute(qwerty); endif; qwerty=" |alter procedure _1sp__1SSYSTEM_TLock AS |return"; con.execute(qwerty); qwerty=" |alter procedure _1sp__1SSYSTEM_TLockX AS |return"; con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не изменена блокировка таблицы актуальности..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; //изменение блокировок справочников с монопольных на построчные qwerty="declare sc_cur cursor for |select name |from sysobjects |where (name like 'SC%') and (name not like '%NEW%') |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0 |open sc_cur |declare @sc_name varchar(50) |declare @sql varchar(1000) |fetch next from sc_cur into @sc_name |while @@FETCH_STATUS = 0 |begin |select @sql = 'alter procedure _1sp_'+@sc_name+'_TLock AS set nocount on declare i integer select i=1 from '+@sc_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |select @sql = 'alter procedure _1sp_'+@sc_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@sc_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |fetch next from sc_cur into @sc_name |end |close sc_cur |DEALLOCATE sc_cur"; con.execute(qwerty); //конец модуля изменения блокировок справочников //изменение блокировок движений регистров с монопольных на построчные qwerty="declare ra_cur cursor for |select name |from sysobjects |where (name like 'RA%') and (name <> 'RAG_1sUSERS') and (name not like '%NEW%') |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0 |open ra_cur |declare @ra_name varchar(50) |declare @sql varchar(1000) |fetch next from ra_cur into @ra_name |while @@FETCH_STATUS = 0 |begin |select @sql = 'alter procedure _1sp_'+@ra_name+'_TLock AS set nocount on declare i integer select i=1 from '+@ra_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |select @sql = 'alter procedure _1sp_'+@ra_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@ra_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |fetch next from ra_cur into @ra_name |end |close ra_cur |DEALLOCATE ra_cur"; con.execute(qwerty); //изменение блокировок итогов регистров с монопольных на построчные qwerty="declare rg_cur cursor for |select name |from sysobjects |where (name like 'RG%') and (name not like '%NEW%') |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0 |open rg_cur |declare @rg_name varchar(50) |declare @sql varchar(1000) |fetch next from rg_cur into @rg_name |while @@FETCH_STATUS = 0 |begin |select @sql = 'alter procedure _1sp_'+@rg_name+'_TLock AS set nocount on declare i integer select i=1 from '+@rg_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |select @sql = 'alter procedure _1sp_'+@rg_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@rg_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |fetch next from rg_cur into @rg_name |end |close rg_cur |DEALLOCATE rg_cur"; con.execute(qwerty); //конец модуля изменения блокировок регистров //удаление блокировок журанала документов try qwerty=" |alter procedure _1sp__1SJOURN_TLockX AS |return"; con.execute(qwerty); qwerty=" |alter procedure _1sp__1SJOURN_TLock AS |return"; con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не отключена блокировка журнала документов..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; //изменение блокировок журналов документов с монопольных на построчные qwerty="declare dt_cur cursor for |select name |from sysobjects |where (name like 'DT%') and (name not like '%NEW%') |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0 |open dt_cur |declare @dt_name varchar(50) |declare @sql varchar(1000) |fetch next from dt_cur into @dt_name |while @@FETCH_STATUS = 0 |begin |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dt_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |select @sql = 'alter procedure _1sp_'+@dt_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dt_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |fetch next from dt_cur into @dt_name |end |close dt_cur |DEALLOCATE dt_cur"; con.execute(qwerty); qwerty="declare dh_cur cursor for |select name |from sysobjects |where (name like 'DH%') and (name not like '%NEW%') |and type = 'U' and OBJECTPROPERTY(id,'IsMSShipped') = 0 |open dh_cur |declare @dh_name varchar(50) |declare @sql varchar(1000) |fetch next from dh_cur into @dh_name |while @@FETCH_STATUS = 0 |begin |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLock AS set nocount on declare i integer select i=1 from '+@dh_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |select @sql = 'alter procedure _1sp_'+@dh_name+'_TLockX AS set nocount on declare i integer select i=1 from '+@dh_name+' (ROWLOCK HOLDLOCK XLOCK) where 0=1' |execute(@sql) |fetch next from dh_cur into @dh_name |end |close dh_cur |DEALLOCATE dh_cur"; con.execute(qwerty); //конец модуля изменения блокировок документов qwerty=" |Delete from RAG_1sUSERS where usrscnt=0"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнена очистка таблицы соединений..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; if check_error=1 then //выполним проверку-исправление возможных ошибок в БД. qwerty=" |DELETE FROM _1sentry |WHERE docid IN (SELECT iddoc FROM _1sjourn (nolock) |WHERE closed=0)"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по непроведенным документам..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |DELETE FROM _1sentry |WHERE docid NOT IN (SELECT iddoc FROM _1sjourn (nolock))"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по несуществующим документам..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |DELETE FROM _1sentry |WHERE docid NOT IN (SELECT docid FROM _1soper (nolock))"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнено удаление проводок по несуществующим операциям..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; qwerty=" |DELETE FROM _1soper |WHERE docid NOT IN (SELECT iddoc FROM _1sjourn (nolock))"; try con.execute(qwerty); except err=err+?(err<>"",linebreak,"")+"Не выполнено удаление операций по несуществующим документам..."+linebreak+ "Описание ошибки: "+geterrordescription()+linebreak+ "---------------------------------------------------------------------------------------"; endtry; endif; con.close(); else err=err+?(err<>"",linebreak,"")+"Неверные параметры соединения с базой данных SQL сервера..."+linebreak+ "---------------------------------------------------------------------------------------"; endif; if err<>"" then err="Ошибки верификации механизма блокировок:"+linebreak+err; message (err); endif endif; endif; endprocedure Процедура ПриНачалеРаботыСистемы() patch_xp(); ... |
|||
25
mvk
06.03.15
✎
09:32
|
Хм. Под этим:
"i; target="_blank" class="registered-user"> была просто собака. ЗЫ. Это надо в глобальник. |
|||
26
mvk
06.03.15
✎
09:35
|
Блин, опять подмена.
Все, что начинается с "http: и заканчивается class="registered-user"> было просто @ |
|||
27
alexandr_87
06.03.15
✎
10:17
|
Спасибо всем))))),будем пробовать....
|
|||
28
vcv
06.03.15
✎
10:20
|
(24) А можно всё это в нормальном виде? Текстовиком на каком-нибудь файлобменнике, например.
|
|||
29
mvk
06.03.15
✎
10:37
|
||||
30
alexandr_87
06.03.15
✎
11:26
|
Пробовал при проведение документа выходит ошибка "invalid cursor state..." и посля этого программа вылетает..
|
|||
31
mvk
06.03.15
✎
11:41
|
Не должно из-за блокировок. Ошибку подробнее...
|
|||
32
alexandr_87
06.03.15
✎
11:50
|
SQL State:24000
Native: 0 Message: [Microsoft][ODBC SQL SERVER DRIVER]Invalid cursor state. |
|||
33
vcv
06.03.15
✎
11:51
|
(30) Какие-либо прямые запросы используются? В ком-то из них курсор не закрывается предположительно.
|
|||
34
ADirks
06.03.15
✎
11:54
|
(23) Это да, стоит слегка налажать с блокировками - и здрассьте дедлоки, или, что ещё хуже, косячные данные.
Потому то в 77 и не стали таких вольностей позволять. Чтобы порог вхождения понизить. |
|||
35
mvk
06.03.15
✎
11:57
|
Релиз 1С? Какой SQL?
|
|||
36
alexandr_87
06.03.15
✎
12:01
|
1c 7.7 27 релиз, SQL 2005
|
|||
37
varelchik
06.03.15
✎
15:09
|
Ха!
А как подружил 7.7 и 2005? |
|||
38
alexandr_87
06.03.15
✎
15:35
|
||||
39
mvk
06.03.15
✎
16:05
|
Свойства базы надо бы глянуть. Да и dbcc checkdb не помешает (после бэкапа)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |