| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Как принудительно создать блокировку?
			 
			
			Пытаюсь на только что созданной таблице создать блокировку 
		
		
		
		
		
		
			Но что-то не получается. Создал джобик на update. Захожу в два сеанса. В первом ставлю точку останову на update. Во втором удаляю эту запись. В результате система сначало ждёт пока я проапдейчу, а только потом удаляет. Блокировки не возникает. Может у кого есть какие идеи, как принудительно создать блокировку. 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			1. Откройте транзакцию 
		
		
		
		
		
		
		
	2. select forupdate forselocked <- в 4ке новый идентификатор, не помню на память точно, как-то так. 3. Закройте транзакцию С Уважением, Георгий  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: plumbum (1). | |
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Сорри. Забыл написать. 
		
		
		
		
		
		
			Ax 3.0 sp4. Oracle 10g. 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Member 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от miklenew
			
			 
... 
		
	В результате система сначало ждёт пока я проапдейчу, а только потом удаляет. Блокировки не возникает. ... Что вы понимаете под блокировкой? Deadlock? Deadlock — это частный случай при работе с блокировками. Обычно блокировки приводят к ожиданиям, как вы написали выше. Deadlock — это конфликт, т.е. когда ожидание ни к чему не приведет. Блокировки возникают даже если к базе подключена только одна сессия. 
				__________________ 
		
		
		
		
	С уважением, glibs®  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Может я мало ждал? Щас попробую подольше подождать. 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Модератор 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Хм. Ну, в общем, это и есть блокировка... Т.е. Вы хотите отследить ситуацию, при которой система скажет "погоди! сейчас над этой записью идет работа другого сеанса?". 
		
		
		
		
		
		
		
	А вот тут вопрос. Ничего необычного-то для ситемы не возникает в данный момент + возможно зависит от настроек. Попробуй X++:     try
     {
         ttsBegin;
         select...
         ttsCommit;
     }
     catch
     {
       info (appl.ttslevel()); //Это просто для примера. Возможно, еще что-то в sysException лежит
       ttsAbort;
     }Георгий  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Member 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от miklenew
			
			 
Так вот она ждёт и сообщение о блокировке не появляется. 
		
	Может я мало ждал? Щас попробую подольше подождать. 
				__________________ 
		
		
		
		
	С уважением, glibs®  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Цитата: 
	
		
			Тупиковая ситуация. Один или несколько пользователей одновременно блокировали всю таблицу или ее часть.
		
	 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Пришёл снял с остановки. И нормально система проапдейтила и удалила запись. Т.е. от времени это не зависит. Тогда вернёмся к первому сообщению "Может у кого есть какие идеи, как принудительно создать блокировку". 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Может стоит пойти от обратного... Не допускать таких ситуаций. Как в журналах например.
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Просто мне казалось, что если нужно, то так можно создать тупиковую ситуацию. Ошибался. Считайте, что здесь сугубо теоретический интерес. 
				__________________ 
		
		
		
		
	Энергия молодых и неравнодушных способна изменить мир к лучшему.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Создаем в таблице две записи. 2 джоба. 1-й джоб: 1. ttsBegin; 2. Блокировка 1-й записи forupdate 3. breakpoint 4. Блокировка 2-й записи forupdate 2-й джоб: 1. ttsBegin; 2. Блокировка 2-й записи forupdate 3. breakpoint 4. Блокировка 1-й записи forupdate Запускаем с одной сессии первый джоб, со второй сессии - второй. Она оба остановятся на п.3 после этого давим F5 в обоих отладчиках и получаем deadlock Правда исключение в аксапте может возникнуть не сразу - зависит от настроек БД  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: miklenew (5). | |
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Спасибо. 
		
		
		
		
		
		
			То что нужно. Вот джобы. Может кому пригодяться. X++: static void Job1(Args _args) { Table2 table; ; ttsbegin; select forupdate table where table.Field1 == '1'; breakPoint; table.update(); select forupdate table where table.Field1 == '2'; ttscommit; } X++: static void Job2(Args _args) { Table2 table; ; ttsbegin; select forupdate table where table.Field1 == '2'; breakPoint; table.update(); select forupdate table where table.Field1 == '1'; ttscommit; } 
				__________________ 
		
		
		
		
		
			Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 19.03.2009 в 13:48.  | 
| 
	
 | 
| Теги | 
| блокировка | 
| 
	
	 | 
	
		
  |