вопрос ученика
От: shtopor  
Дата: 25.08.05 11:34
Оценка:
Привет всем
я новичек, только начинаю изучать sql
mssql 2000, delphi7, ODBC
пишу клиента
на днях сообщили, что клиентских машин будет ~15
заполняю платежку

что делать с блокировками таблиц, как сделать чтоб 15 человек не мешали друг-другу

DECLARE @pol_id int
DECLARE @vid_op int
DECLARE @bic char (9)
DECLARE @corr_acc char (20)
......

set @pol_id=2
select @vid_op=(select pol.vid_id from dbo.pol where pol.pol_id=@pol_id)
select @bic=(select bic from dbo.bank_list where
bic_id=(select bic_id from dbo.pol where pol.pol_id=@pol_id))
select @corr_acc=(select corr_acc from dbo.bank_list where
bic_id=(select bic_id from dbo.pol where pol.pol_id=@pol_id))


BEGIN TRAN
INSERT INTO dbo.op
([user_id],
vid_id,
pol_id,
status_id,
plat_id,
[date],
summa)
VALUES (3, /*user_id*/
@vid_op, /*vid_id*/
@pol_id, /*pol_id*/
1, /*status_id*/
1, /*plat_id*/
GetDate(), /*date*/
1) /*summa*/
SELECT @id_op = (SELECT IDENT_CURRENT('dbo.op'))
SELECT @Num_PayDoc = IsNull(Max(paydoc.Num), 0) FROM dbo.paydoc WITH (TABLOCKX)
WHERE ([date] BETWEEN CONVERT(DATETIME,'2005-08-24 00:00:00', 102)
AND CONVERT(DATETIME, '2005-08-24 23:59:59', 102))
INSERT INTO dbo.paydoc
(op,
num,
[date],
branch_id,
plat_id,
schet_num,
schet_date,
schet_prim1,
schet_prim2,
schet_prim3,
pol_id,
[bic],
[cor_acc],
[bank_name],
.....
VALUES ( @id_op,
@Num_PayDoc + 1,
getdate(),
1,
1,
'test2',
'test2',
'test2',
@pol_id,
@bic,
@corr_acc,
@bank_name,
.........
COMMIT TRAN
Re: вопрос ученика
От: Arsu Россия  
Дата: 25.08.05 16:21
Оценка:
S>Привет всем
S>я новичек, только начинаю изучать sql
S>mssql 2000, delphi7, ODBC
S>пишу клиента
S>на днях сообщили, что клиентских машин будет ~15
S>заполняю платежку
S>что делать с блокировками таблиц, как сделать чтоб 15 человек не мешали друг-другу

1. Чтоб 15 человек не мешали друг другу, надо делать транзакцию как можно короче. У тебя простая вроде транзакция, неужели проблему есть?

2. @Num_PayDoc никак нельзя сделать автоинкрементным? если сделать — исчезнет один селект в транзакции

3. В твоём варианте транзакция будет закоммичена, даже если в каком-нить операторе произойдёт ошибка. Чтобы отлавливать ошибку, надо после каждого оператора писать что-нить типа
if @@error <> 0 
begin 
   rollback tran  --откатываем транзакцию
   return         --выходим из процедуры
end
Re[2]: вопрос ученика
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 25.08.05 17:39
Оценка:
Здравствуйте, Arsu, Вы писали:

A>3. В твоём варианте транзакция будет закоммичена, даже если в каком-нить операторе произойдёт ошибка. Чтобы отлавливать ошибку, надо после каждого оператора писать что-нить типа
A>if @@error <> 0 
A>begin 
A>   rollback tran  --откатываем транзакцию
A>   return         --выходим из процедуры
A>end
A>


Или, еслт семантика того требует, то

if @@rowcount = 0
begin
  rollback transaction
  return
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: вопрос ученика
От: tpg Россия http://www.sql.ru/
Дата: 26.08.05 04:05
Оценка:
Здравствуйте, Arsu, Вы писали:

A>3. В твоём варианте транзакция будет закоммичена, даже если в каком-нить операторе произойдёт ошибка. Чтобы отлавливать ошибку, надо после каждого оператора писать что-нить типа
A>if @@error <> 0 
A>begin 
A>   rollback tran  --откатываем транзакцию
A>   return         --выходим из процедуры
A>end
A>


Или, если нет охоты обрабатывть ошибку/и, установить перед началом транзакции SET XACT_ABORT ON.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.