表设计:
财务流水表 ms
/****** 对象: Table [dbo].[ms] 脚本日期: 09/12/2010 14:25:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ms](
[fcid] [int] IDENTITY(1,1) NOT NULL,--自增长ID
[m] [int] NULL CONSTRAINT [DF__member_money__m__0519C6AF] DEFAULT ((0)),--发生金额,收入时为正值,消费时为负值
[d] [datetime] NULL,--日期时间
[des] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,--摘要
[mid] [int] NULL,--会员ID
[ye] [int] NULL,--余额
CONSTRAINT [PK__member_money__0425A276] PRIMARY KEY CLUSTERED
(
[fcid] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
--充值与消费的存储过程
create proc pro_fc(@mid int,@m int,@des varchar(50))
as
declare @d datetime
set @d =getdate()
insert into ms(mid,m,d,des) values (@mid,@m,@d,@des)
--执行充值/消费的语句,并没有实时计算出余额
exec pro_fc 1001,1,'充值'
exec pro_fc 1001,-1,'消费'
--查询消费明细的语句
select top 10 mid as 会员ID,d as 时间,des as 摘要,m 金额,余额 = (select sum(m) from ms b where fcid <= a.fcid and mid=1001 ) from ms a where mid=1001 order by d
--结果
会员 日期 摘要 金额 余额
1001 2010-09-12 13:13:48.967 充值 1 1
1001 2010-09-12 13:13:48.967 消费 -1 0
1001 2010-09-12 13:15:06.513 充值 1 1
1001 2010-09-12 13:15:06.513 消费 -1 0
1001 2010-09-12 13:15:06.653 充值 1 1
1001 2010-09-12 13:15:06.653 消费 -1 0
1001 2010-09-12 13:15:06.840 充值 1 1
1001 2010-09-12 13:15:06.840 消费 -1 0
1001 2010-09-12 13:15:06.980 充值 1 1
1001 2010-09-12 13:15:06.980 消费 -1 0
说明:执行充值/消费时我用同一个用户ID1001 用ASP.NET 写了一个一次执行10000次插入(有消费有充值)的语句的网页, 再用另一个容器页写200个IFRAME来引用这个执行页, 且这个容器页在多个窗口中打开,日地就是为了模拟多用户同时(并发)插入记录的情况(您有没有发现上面的记录有消费和充值同时进行)
以上的结果是正确的,我最大的目的就是要得行每一次发生充值或消费时的正确余额,各位看官,本为我在充值与消费的存储过程中就计算出余额,但经测试,在并发情况下,得到的余额是不正确的.
现在这个方案虽然可行,但我认为--查询消费明细的语句这种方法效率低下,您有好的方法吗?