去年发过一贴,现在发现还有问题
http://topic.csdn.net/u/20100622/10/e05eb65b-9958-4069-ae42-2f2e086cf689.html
比如流水号表
001
002
003获取新流水号 select max(ls_h) from lsh
然后插入新流水号到 lsh如果用户1,用户2 同时操作的话 流水号 就会重复这是事务:
procedure TForm1.Button4Click(Sender: TObject);
var
ls_h:string;
begin
ADOConnection1.Connected := true;
ADOConnection1.LoginPrompt := false;
ADOQuery1.close; ADOQuery1.Connection.BeginTrans;
try
ADOQuery1.sql.clear;
ADOQuery1.sql.add('Select max(ls_h) from lsh');
ADOQuery1.open;
ls_h:=ADOQuery1.Fields[0].AsString;ls_h:=FormatFloat('000',StrToFloat(ls_h)+1); ADOQuery1.sql.clear;
ADOQuery1.sql.add(' insert into lsh(ls_h) values ('''+ls_h+''') ');
ADOQuery1.ExecSql; ADOQuery1.Connection.CommitTrans;
except
on e:exception do
begin
ADOQuery1.Connection.RollbackTrans;
Application.MessageBox(PChar(e.message),'执行事务失败,请重试!',MB_OK+MB_IconQuestion);
end;
end;
ADOQuery1.close;
end;我通过两个同样程序的按钮到时执行命令,发现还会重复
procedure TForm1.Button5Click(Sender: TObject);
var
nowStr,str:string;
begin
while 1 = 1 do
begin
nowStr:=FormatDateTime('yyyy-mm-dd hh:nn:sss',now);
if nowStr>='2011-06-07 09:38:40' then
begin
Break;
end;
end;
Button4.Click;
end;事务不起作用,数据库还是 插入了 两个004
http://topic.csdn.net/u/20100622/10/e05eb65b-9958-4069-ae42-2f2e086cf689.html
比如流水号表
001
002
003获取新流水号 select max(ls_h) from lsh
然后插入新流水号到 lsh如果用户1,用户2 同时操作的话 流水号 就会重复这是事务:
procedure TForm1.Button4Click(Sender: TObject);
var
ls_h:string;
begin
ADOConnection1.Connected := true;
ADOConnection1.LoginPrompt := false;
ADOQuery1.close; ADOQuery1.Connection.BeginTrans;
try
ADOQuery1.sql.clear;
ADOQuery1.sql.add('Select max(ls_h) from lsh');
ADOQuery1.open;
ls_h:=ADOQuery1.Fields[0].AsString;ls_h:=FormatFloat('000',StrToFloat(ls_h)+1); ADOQuery1.sql.clear;
ADOQuery1.sql.add(' insert into lsh(ls_h) values ('''+ls_h+''') ');
ADOQuery1.ExecSql; ADOQuery1.Connection.CommitTrans;
except
on e:exception do
begin
ADOQuery1.Connection.RollbackTrans;
Application.MessageBox(PChar(e.message),'执行事务失败,请重试!',MB_OK+MB_IconQuestion);
end;
end;
ADOQuery1.close;
end;我通过两个同样程序的按钮到时执行命令,发现还会重复
procedure TForm1.Button5Click(Sender: TObject);
var
nowStr,str:string;
begin
while 1 = 1 do
begin
nowStr:=FormatDateTime('yyyy-mm-dd hh:nn:sss',now);
if nowStr>='2011-06-07 09:38:40' then
begin
Break;
end;
end;
Button4.Click;
end;事务不起作用,数据库还是 插入了 两个004
解决方案 »
- 怎么在dll里写个窗口啊
- 帮我看下这段代码哪里有隐含错误?多谢
- 面向对象、数据结构、编译原理、离散数学... 等等等一大堆的知识,该以什么样的顺序学习较好呢?
- 关于EhLib v3.4一个数据值过大引起BUG.
- (来者有分):用adodataset的commandtext的sql语句删除操作后,为什么提示recordset can not open!!
- 简单问题!!!
- 如何提高我的显示速度,这问题真是难倒我了,请多多指教!!
- 请问如何控制Dephi的备份策略?我在菜单里转半天也没找到
- 到底这里有人会没有呀 我都问了三边了 可是到现在还没有一个正确的答案 请各位英雄帮帮我吧!!
- delphi4、与delphi5或delphi6之间能共存吗?
- copy,leftstr,pos哪里效率更高
- ADODataSet 控件 怎么判断正在连接的人数!
select * from t1(with UPDLOCK)WITH ( <table_hint> )
指定查詢最佳化工具必須搭配這份資料表,並針對這個陳述式來使用最佳化或鎖定策略。如需詳細資訊,請參閱<資料表提示 (Transact-SQL)>。在 SQL Server 2005 中,除了部份例外狀況,只有在利用 WITH 關鍵字來指定提示時,FROM 子句才支援資料表提示。另外,還必須利用括號來指定資料表提示。
以下是允許和不允許使用 WITH 關鍵字的資料表提示:NOLOCK、READUNCOMMITTED、UPDLOCK、REPEATABLEREAD、SERIALIZABLE、READCOMMITTED、FASTFIRSTROW、TABLOCK、TABLOCKX、PAGLOCK、ROWLOCK、NOWAIT、READPAST、XLOCK 及 NOEXPAND。如果是利用不含 WITH 關鍵字的方式指定這些資料表提示,則必須單獨指定提示。例如:FROM t (fastfirstrow)。
如果是利用含有其他選項的方式指定提示 (例如:在 (fastfirstrow, index(myindex) 中),則必須利用含有 WITH 關鍵字的方式指定提示,例如:
FROM t WITH (fastfirstrow, index(myindex)).
如果資料庫的相容性層級為 80 或更早,提示就不一定要使用 WITH 關鍵字
oracle:
select * from t1 for update [nowait]
如两张表,一张表中的某个字段减一时,要将另一张表中的相应字段加一. 当上面操作仅进行一半时就导致数据出错(第一张表减了,第二张表却没加),这时,事务处理也是一个解决办法,用了事务处理后,上述操作要么全部执行,要么全部不执行
事务一般用在批处理的过程中SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
ADOQuery的LockType=ltPessimistic 这样吗?