有位说到业务和事务的问题, 如果业务占用时间多的话, 在多用户并发的情况下将此业务做进事务里对表进行并发控制是会产生效率问题.
但是楼主的意思是不知道并发如何控制, 比如:
甲售票点(甲事务)读出某航班的机票余额A,设A=16.
乙售票点(乙事务)读出同一航班的机票余额A,也为16.
甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
在此我举个例子:
首先请楼主在SQL查询分器起中执行如下语句:
/****************************************************************/
/* 表: 售票 */
/* 作用:存储售票记录 */
/****************************************************************/
if exists(Select OBJECT_ID(N'售票')) drop table 售票
go
create table 售票
(票数量 integer)
insert into 售票 values(50) --初始化,使表中有50张票
go
/****************************************************************/
/* 表: 日志表 */
/* 作用:存储售票日志 */
/****************************************************************/
if exists(Select OBJECT_ID(N'日志')) drop table 日志
go
create table 日志
(日志 datetime)
go
/****************************************************************/
/* 存储过程: 售票_ShortTime_Transaction */
/* 作用: 在 短时间 内使票数-1 */
/****************************************************************/
if exists(Select OBJECT_ID(N'售票_ShortTime_Transaction')) drop proc 售票_ShortTime_Transaction
go
Create Proc 售票_ShortTime_Transaction /*本存储过程将在 短时间 内使票数-1*/
as
begin tran --开始一个事务
insert into 日志 values(GETUTCDATE()) --向日志表插入一条记录,证明已执行本事务
Declare @tem_票数 integer
set @tem_票数 = (select 票数量 from 售票)
set @tem_票数 = @tem_票数 - 1
update 售票 set 票数量 = @tem_票数
commit --提交事务
go
/****************************************************************/
/* 存储过程: 售票_LongTime_Transaction */
/* 作用: 在一段 较长时间 内使票数-1 */
/****************************************************************/
if exists(Select OBJECT_ID(N'售票_LongTime_Transaction')) drop proc 售票_LongTime_Transaction
go
Create Proc 售票_LongTime_Transaction
as
begin tran
insert into 日志 values(GETUTCDATE()) --向日志表插入一条记录,证明已执行本事务
Declare @tem_票数 integer
set @tem_票数=(select 票数量 from 售票)
Declare @i decimal
Set @i=0
while(@i<500000) --完成此循环我的计算机需要2s左右
set @i=@i+1
set @tem_票数 = @tem_票数 - 1
update 售票 set 票数量 = @tem_票数
commit
go