create proc ptest @p1 varchar(2),@p2 varchar(10),@p3 char(1),@p4 varchar(1) as set nocount on begin tran insert into T_current(TableID,DishID,IsFree,amount) values(@p1,@p2,@p3,@p4) if @@error=0 commit tran else rollback tran go
TO bugchen888(臭虫) : insert into ...... select ... from ....??怎么用呀,更新的内容并不是从另外一张表中更新过来的,怎么用上select ... from ....??请再指教一下。
To Yisa() :create proc你是指建一个存储过程,然后连续篇调用吗?如果是这样从SQL探查器中跟踪到数据库的执行情况没有得到改善呀!这种一次操作要向某表添加多条记录的情况应该是很多人都会碰到的吧,你们都是怎么解决的呢?
TO CSDNMicroSoft(海贼王,我当定了.) : Thanks for your 顶顶顶顶顶顶顶顶顶 这个问题有这么难吗?
TO Eric2000(消灭小日本) : 你说有很有道理,现在不明白的是:如果表A要更新,如何在更新前锁住表A不让其它用户更新直至本次更新全部完成才允许其它用户去更新表A。
参见SQL-Server联机帮助: 1.并发控制-不锁定时的问题 2.并发控制-锁定
2. SQL Server 中的锁定介绍 Microsoft® SQL Server™ 2000 具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。SQL Server 可以锁定以下资源(按粒度增加的顺序列出)。资源 描述 RID 行标识符。用于单独锁定表中的一行。 键 索引中的行锁。用于保护可串行事务中的键范围。 页 8 千字节 (KB) 的数据页或索引页。 扩展盘区 相邻的八个数据页或索引页构成的一组。 表 包括所有数据和索引在内的整个表。 DB 数据库。 SQL Server 使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。SQL Server 使用以下资源锁模式。锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。 意向 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 共享锁 共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。更新锁 更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。排它锁 排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。意向锁 意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。锁模式 描述 意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。 架构锁 执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁。当编译查询时,使用架构稳定性 (Sch-S) 锁。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它 (X) 锁。因此在编译查询时,其它事务(包括在表上有排它 (X) 锁的事务)都能继续运行。但不能在表上执行 DDL 操作。大容量更新锁 当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新 (BU) 锁。大容量更新 (BU) 锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。
To Eric2000(消灭小日本) 1、多条Insert语句插入只能逐条去做,换了任何一种数据库也是如此,所以也没有优化的方案和必要,这就和人吃饭一样,要一口一口吃。 ---------------------------------------------------------------------------------------- 并不是在每种数据库中都要这样去做的,好像只有像Sql Server这样功能比较弱的数据库才需要这样去做。理论上在Sql Server中可以使用INSERT INTO ... SELECT ... FROM ...的结构实现上述功能,例如INSERT INTO REGION SELECT 10,'A' UNION SELECT 11,'B' 但是当一次性新增的数据超过5000的话就会出现数据池满的现象,因此才会出现了逐条插入或者每次插入少量数据的权宜之计。 而在Oracle和MySql中INSERT Statement提供了INSERT INTO ... VALUES(...),(...)的结构,例如INSERT INTO REGION VALUES(10,'A'),(11,'B')这样是可以实现批量新增的功能的,只要能够保证事务的完整性即可。
1.用sp,更新,插入,删除都用begin transaction ..commit.rollback,给你你一个我去年写的sp,用到现在,都要比较稳定 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WH_CHANGE]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[WH_CHANGE] GOSET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO--CreationDate : 2004/11/15 --Author :Mabel Deng CREATE proc dbo.WH_CHANGE @Vend varchar(8) = '' , @CSID varchar(10) = '' , @WHSE varchar(8) = '', = @DWHSE varchar(8) = '' , @ErrMessage varchar(50) = '' Output --如果失败,给用户错误信息 ,如果操作失--败就rollback as declare @Sta varchar(1) if not exists(SELECT * FROM cs WHERE cs_vend = @Vend and cs_id = @CSID and Cs_sta < '3') or not exists(SELECT * FROM dy WHERE dy_vend = @Vend and dy_csid = @CSID and Dy_sta < '3') begin SELECT @Sta = cs_sta FROM cs WHERE cs_vend = @Vend and cs_id = @CSID GOTO ErrExit_CanNotChg end if not exists(SELECT * FROM cs_pwh WHERE p_wh = @WHSE and p_dwh = @DWHSE ) GOTO ErrExit_NotMatch BEGIN TRANSACTION --UPDATE CS_WHSE update cs set cs_whse = @WHSE WHERE cs_vend = @Vend and cs_id = @CSID IF @@ERROR <> 0 GOTO ErrExit_Cs_1 --UPDATE dy_whse update dy set dy_whse =@WHSE WHERE dy_vend = @Vend and dy_csid = @CSID IF @@ERROR <> 0 GOTO ErrExit_Dy_1 --UPDATE csh_whse update cs_h set csh_whse =@WHSE WHERE csh_vend = @Vend and csh_id = @CSID IF @@ERROR <> 0 GOTO ErrExit_Cs_h --UPDATE cs_dwhse update cs set cs_dwhse = @DWHSE WHERE cs_vend = @Vend and cs_id = @CSID if @@ERROR <> 0 GOTO ErrExit_Cs_2 --UPDATE dy_dwhse update dy set dy_dwhse = @DWHSE WHERE dy_vend = @Vend and dy_csid =@CSID if @@ERROR <> 0 GOTO ErrExit_dy_2 --UPDATE cswh_whse update cs_wh set cswh_whse = @DWHSE WHERE cswh_vend = @Vend and cswh_csid = @CSID if @@ERROR <> 0 GOTO ErrExit_Cs_wh --UPDATE dr_dwhse update dr set dr_dwhse = @DWHSE WHERE dr_vend = @Vend and dr_csid = @CSID if @@ERROR <> 0 GOTO ErrExit_Dr COMMIT TRANSACTION RETURN 0 ErrExit_CanNotChg: SET @ErrMessage = '送貨單不能再修改!狀態為 ' + @Sta RETURN 1 ErrExit_NotMatch: SET @ErrMessage = '交貨地點和庫位不匹配,請重新修改!' RETURN 1 ErrExit_Cs_1: ROLLBACK TRANSACTION Select @ErrMessage = ' 修改CS檔送貨地點更新失敗!' Return 1 ErrExit_Dy_1: ROLLBACK TRANSACTION Select @ErrMessage = '修改DY檔送貨地點更新失敗!' Return 1 ErrExit_Cs_h: ROLLBACK TRANSACTION Select @ErrMessage = '修改Cs_h送貨地點更新失敗!' Return 1 ErrExit_Cs_2: ROLLBACK TRANSACTION Select @ErrMessage = '修改Cs檔庫位更新失敗!' Return 1 ErrExit_dy_2: ROLLBACK TRANSACTION Select @ErrMessage = '修改DY檔庫位更新失敗!' Return 1 ErrExit_Cs_wh: ROLLBACK TRANSACTION Select @ErrMessage = '修改Cs檔庫位更新失敗!' Return 1 ErrExit_Dr: ROLLBACK TRANSACTION Select @ErrMessage = '修改Dr檔庫位更新失敗!' Return 1GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO 2.在前台程式控制,插入一定量数据才递交,不要频繁做递交动作 3,反正大家都可能用,那么select 就加上with (nolock)---与你的主题关系不大
TO MorningTea(早茶):[插入一定量数据才递交,不要频繁做递交动作]这个观点很好,同时你这个存储过程更新操作可以传入几个同时更新的所有值,但对于一次性多条记录的添加情况与更新记录有所不同,因为传入的值事先并不知道会传多少条记录:如下存储过程 CREATE PROCEDURE PDA_DishInfo_InsertCurrentProcessing @TableID VARCHAR(6), @DishID VARCHAR(10), @amount VARCHAR(10), @IsFree INT AS BEGIN INSERT INTO T_CurrentProcessing(tableID,DishID,IsFree,amount) VALUES(@tableID,@DishID,@IsFree,@amount) END 如果要添加多条记录明显这种存储过程不得不多次发生调用情况,这种多次插入而且几乎都是在同一时间多个客户同时添加不同几十条记录,这样就会造成像 flyfing(江山如此多娇) 所说的一条记录可能会被超过一次添加入库。解决这种问题存储过程优化呢还是另外的做法?
as
set nocount on
begin tran
insert into T_current(TableID,DishID,IsFree,amount)
values(@p1,@p2,@p3,@p4)
if @@error=0
commit tran
else
rollback tran
go
insert into ...... select ... from ....??怎么用呀,更新的内容并不是从另外一张表中更新过来的,怎么用上select ... from ....??请再指教一下。
这个问题有这么难吗?
2、批导入不适用你说的这种情况,现实操作中也不允许,因为你必须维护每一个事务的完整性;
3、用事务进行控制,利用数据库的自动加锁--阻塞机制,保证事务排队序列中的每个事务完成;
4、如果不幸由于数据库资源的相互占用造成死锁,必须重新考虑数据更新的方式,修改程序逻辑。死锁和阻塞的区别在于:阻塞是数据库正常的现象,是由于多个事务对相同的资源进行访问而引起的,随着事务排队序列中各个事务的提交或者回滚,阻塞会自动解除;
然而不幸的是,阻塞往往导致死锁,由于事务过长或者更新顺序设置的问题造成资源冲突引起死锁。
死锁不能自动解除,必须终止导致死锁的数据库进程才能解除死锁。
你说有很有道理,现在不明白的是:如果表A要更新,如何在更新前锁住表A不让其它用户更新直至本次更新全部完成才允许其它用户去更新表A。
1.并发控制-不锁定时的问题
2.并发控制-锁定
SQL Server 中的锁定介绍
Microsoft® SQL Server™ 2000 具有多粒度锁定,允许一个事务锁定不同类型的资源。为了使锁定的成本减至最少,SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)可以增加并发但需要较大的开销,因为如果锁定了许多行,则需要控制更多的锁。锁定在较大的粒度(例如表)就并发而言是相当昂贵的,因为锁定整个表限制了其它事务对表中任意部分进行访问,但要求的开销较低,因为需要维护的锁较少。SQL Server 可以锁定以下资源(按粒度增加的顺序列出)。资源 描述
RID 行标识符。用于单独锁定表中的一行。
键 索引中的行锁。用于保护可串行事务中的键范围。
页 8 千字节 (KB) 的数据页或索引页。
扩展盘区 相邻的八个数据页或索引页构成的一组。
表 包括所有数据和索引在内的整个表。
DB 数据库。
SQL Server 使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。SQL Server 使用以下资源锁模式。锁模式 描述
共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时对同一资源进行多重更新。
意向 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
架构 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。
共享锁
共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。更新锁
更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。排它锁
排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。意向锁
意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。锁模式 描述
意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。
意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。
与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。
架构锁
执行表的数据定义语言 (DDL) 操作(例如添加列或除去表)时使用架构修改 (Sch-M) 锁。当编译查询时,使用架构稳定性 (Sch-S) 锁。架构稳定性 (Sch-S) 锁不阻塞任何事务锁,包括排它 (X) 锁。因此在编译查询时,其它事务(包括在表上有排它 (X) 锁的事务)都能继续运行。但不能在表上执行 DDL 操作。大容量更新锁
当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新 (BU) 锁。大容量更新 (BU) 锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。
1、多条Insert语句插入只能逐条去做,换了任何一种数据库也是如此,所以也没有优化的方案和必要,这就和人吃饭一样,要一口一口吃。
----------------------------------------------------------------------------------------
并不是在每种数据库中都要这样去做的,好像只有像Sql Server这样功能比较弱的数据库才需要这样去做。理论上在Sql Server中可以使用INSERT INTO ... SELECT ... FROM ...的结构实现上述功能,例如INSERT INTO REGION SELECT 10,'A' UNION SELECT 11,'B' 但是当一次性新增的数据超过5000的话就会出现数据池满的现象,因此才会出现了逐条插入或者每次插入少量数据的权宜之计。
而在Oracle和MySql中INSERT Statement提供了INSERT INTO ... VALUES(...),(...)的结构,例如INSERT INTO REGION VALUES(10,'A'),(11,'B')这样是可以实现批量新增的功能的,只要能够保证事务的完整性即可。
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WH_CHANGE]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[WH_CHANGE]
GOSET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO--CreationDate : 2004/11/15
--Author :Mabel Deng
CREATE proc dbo.WH_CHANGE
@Vend varchar(8) = '' ,
@CSID varchar(10) = '' ,
@WHSE varchar(8) = '', =
@DWHSE varchar(8) = '' ,
@ErrMessage varchar(50) = '' Output --如果失败,给用户错误信息 ,如果操作失--败就rollback
as
declare @Sta varchar(1)
if not exists(SELECT * FROM cs WHERE cs_vend = @Vend and cs_id = @CSID and Cs_sta < '3')
or not exists(SELECT * FROM dy WHERE dy_vend = @Vend and dy_csid = @CSID and Dy_sta < '3')
begin
SELECT @Sta = cs_sta FROM cs WHERE cs_vend = @Vend and cs_id = @CSID
GOTO ErrExit_CanNotChg
end
if not exists(SELECT * FROM cs_pwh WHERE p_wh = @WHSE and p_dwh = @DWHSE )
GOTO ErrExit_NotMatch
BEGIN TRANSACTION
--UPDATE CS_WHSE
update cs set cs_whse = @WHSE WHERE cs_vend = @Vend and cs_id = @CSID
IF @@ERROR <> 0 GOTO ErrExit_Cs_1
--UPDATE dy_whse
update dy set dy_whse =@WHSE WHERE dy_vend = @Vend and dy_csid = @CSID
IF @@ERROR <> 0 GOTO ErrExit_Dy_1
--UPDATE csh_whse
update cs_h set csh_whse =@WHSE WHERE csh_vend = @Vend and csh_id = @CSID
IF @@ERROR <> 0 GOTO ErrExit_Cs_h
--UPDATE cs_dwhse
update cs set cs_dwhse = @DWHSE WHERE cs_vend = @Vend and cs_id = @CSID
if @@ERROR <> 0 GOTO ErrExit_Cs_2
--UPDATE dy_dwhse
update dy set dy_dwhse = @DWHSE WHERE dy_vend = @Vend and dy_csid =@CSID
if @@ERROR <> 0 GOTO ErrExit_dy_2
--UPDATE cswh_whse
update cs_wh set cswh_whse = @DWHSE WHERE cswh_vend = @Vend and cswh_csid = @CSID
if @@ERROR <> 0 GOTO ErrExit_Cs_wh
--UPDATE dr_dwhse
update dr set dr_dwhse = @DWHSE WHERE dr_vend = @Vend and dr_csid = @CSID
if @@ERROR <> 0 GOTO ErrExit_Dr
COMMIT TRANSACTION
RETURN 0
ErrExit_CanNotChg:
SET @ErrMessage = '送貨單不能再修改!狀態為 ' + @Sta
RETURN 1
ErrExit_NotMatch:
SET @ErrMessage = '交貨地點和庫位不匹配,請重新修改!'
RETURN 1
ErrExit_Cs_1:
ROLLBACK TRANSACTION
Select @ErrMessage = ' 修改CS檔送貨地點更新失敗!'
Return 1
ErrExit_Dy_1:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改DY檔送貨地點更新失敗!'
Return 1
ErrExit_Cs_h:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改Cs_h送貨地點更新失敗!'
Return 1
ErrExit_Cs_2:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改Cs檔庫位更新失敗!'
Return 1
ErrExit_dy_2:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改DY檔庫位更新失敗!'
Return 1
ErrExit_Cs_wh:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改Cs檔庫位更新失敗!'
Return 1
ErrExit_Dr:
ROLLBACK TRANSACTION
Select @ErrMessage = '修改Dr檔庫位更新失敗!'
Return 1GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
2.在前台程式控制,插入一定量数据才递交,不要频繁做递交动作
3,反正大家都可能用,那么select 就加上with (nolock)---与你的主题关系不大
CREATE PROCEDURE PDA_DishInfo_InsertCurrentProcessing
@TableID VARCHAR(6),
@DishID VARCHAR(10),
@amount VARCHAR(10),
@IsFree INT
AS
BEGIN
INSERT INTO T_CurrentProcessing(tableID,DishID,IsFree,amount)
VALUES(@tableID,@DishID,@IsFree,@amount)
END
如果要添加多条记录明显这种存储过程不得不多次发生调用情况,这种多次插入而且几乎都是在同一时间多个客户同时添加不同几十条记录,这样就会造成像 flyfing(江山如此多娇) 所说的一条记录可能会被超过一次添加入库。解决这种问题存储过程优化呢还是另外的做法?