22,209
社区成员
发帖
与我相关
我的任务
分享
BEGIN
SET NOCOUNT ON;
Declare c Cursor For <select * from Task>
Open c
Fetch next From c into <params....>
While <condition..> Begin
BEGIN TRAN
--删除过期任务记录
DELETE TaskRecord where ....
--记录任务进程
SELECT xxxx FROM TaskRecord WHERE .....
IF @@ROWCOUNT=0
BEGIN
.....
INSERT INTO TaskRecord .....
END
END
ELSE IF xxxxx
BEGIN
UPDATE TaskRecord .....
END
COMMIT TRAN
Fetch next From c into ....
End
Close c
Deallocate c
End
CREATE PROCEDURE [dbo].[TaskProcess]
@userId INT,
@fieldId INT,
@processValue BIGINT,
@isAddValue BIT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Id INT,@Operation INT,@Value INT,@Cycle INT,@IsAutoAccept BIT,@IsRepeatable BIT,@Bonus BIGINT
Declare c Cursor For (Select Id,Operation,Value,Cycle,IsAutoAccept,IsRepeatable,Bonus
From Task WHERE FieldId=@fieldId AND IsPublished=1)
Open c
Fetch next From c into @Id,@Operation,@Value,@Cycle,@IsAutoAccept,@IsRepeatable,@Bonus
While @@Fetch_Status=0 Begin
--删除过期任务记录
DELETE TaskRecord WHERE TaskId=@Id AND UserId=@userId
AND [TimeStamp] < CURRENT_TIMESTAMP
DECLARE @IsTaskFinish BIT
DECLARE @newValue BIGINT
DECLARE @expiredTime DATETIME
SET @expiredTime=dbo.GetExpiredTime(@Cycle)
--记录任务进程
BEGIN TRAN
DECLARE @recordId INT,@IsFinished BIT,@curValue BIGINT
SELECT @recordId=Id,@IsFinished=IsFinished,@curValue=CurValue
FROM TaskRecord WHERE TaskId=@Id AND UserId=@userId
IF @@ROWCOUNT=0
BEGIN
IF @IsAutoAccept=0
BEGIN
PRINT 'Task not accept'
END
ELSE
BEGIN
SET @newValue=@processValue
SET @IsTaskFinish=dbo.IsTaskFinish(@newValue,@Operation,@Value)
IF @IsTaskFinish=0
SET @Bonus = 0
INSERT INTO TaskRecord (UserId,TaskId,IsFinished,Bonus,CurValue,[TimeStamp])
VALUES (@userId,@Id,@IsTaskFinish,@Bonus,@newValue,@expiredTime)
SET @recordId=@@IDENTITY
END
END
ELSE IF @IsFinished = 0 OR @IsRepeatable = 1
BEGIN
IF @isAddValue=1
SET @newValue=@curValue + @processValue
ELSE
SET @newValue=@processValue
SET @IsTaskFinish=dbo.IsTaskFinish(@newValue,@Operation,@Value)
IF @IsTaskFinish=0
SET @Bonus = 0
UPDATE TaskRecord SET IsFinished=@IsTaskFinish,Bonus=Bonus+@Bonus,CurValue=@newValue
WHERE Id=@recordId
END
COMMIT TRAN
Fetch next From c into @Id,@Operation,@Value,@Cycle,@IsAutoAccept,@IsRepeatable,@Bonus
End
Close c
Deallocate c
END
GO
USE [Poke]
GO
/****** Object: Table [dbo].[TaskRecord] Script Date: 2014/8/8 14:45:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TaskRecord](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NOT NULL,
[TaskId] [int] NOT NULL,
[IsFinished] [bit] NOT NULL,
[Bonus] [bigint] NOT NULL,
[CurValue] [bigint] NOT NULL,
[TimeStamp] [datetime] NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
USE [TestDB]
GO
/****** Object: Table [dbo].[Test] Script Date: 2014/8/8 13:42:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Test](
[Id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NOT NULL
) ON [PRIMARY]
GO
2. 开两个查询窗口分别执行如下语句.
USE [TestDB]
GO
declare @num int
set @num=0
while @num<10
begin
BEGIN TRAN
waitfor delay '00:00:03'
DELETE Test WHERE Id>30
waitfor delay '00:00:03'
INSERT INTO [dbo].[Test] ([name]) VALUES ('a')
waitfor delay '00:00:03'
UPDATE [dbo].[Test]
SET [name] = 'b' WHERE id > 20
set @num = @num+1
commit tran
end
go