以前数据库操作,我是很少用事务的,最近做一个项目,发现偶尔总是少一些数据没有写入到数据库,也没有报错误,看了半天,也不知道是什么原因,后来把一条insert语句分成两条写,就好了,数据就没有丢失了,怀疑和写入的字段太大有关系。后来考虑还是不保险啊,就直接用事务了。
下面这个就是我写的一个简单的事务的例子。是单位就餐补助查询用的,主要是根据就餐的记录判断餐别,对不同的人增加补助,就是一个运算而已,以前财务用电子表格也能做,看着电子表格忙活半天,又心有不忍,做了个简单的查询,也讲将就了。
CREATE PROCEDURE [dbo].[AddBZmoney] AS---确定就餐类型和补助金额
begin
begin tran
insert into SumBZ(卡号,日期,餐别,就餐金额)--汇总每日就餐明细
SELECT Detail.卡号, Detail.就餐日期, dbo.GetBZType(Detail.就餐时间) AS 餐别, --查询就餐金额
SUM(Detail.消费金额) AS 消费金额
FROM Detail INNER JOIN
BZType ON dbo.GetBZType(Detail.就餐时间) = BZType.餐别
WHERE (Detail.状态 = 0)
GROUP BY Detail.就餐日期, dbo.GetBZType(Detail.就餐时间), Detail.卡号
update Detail set 状态=1 where 状态=0--更新补助状态
create table TempBZ--建立中间表,确定补助的金额
(
ID int,
BZmoney money
)
insert into TempBZ
SELECT SumBZ.ID,
CASE
WHEN SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=1 and SumBZ.餐别='晚餐'THEN BZType.补助标准--晚餐有加班补助的,超过4元补4元
when SumBZ.就餐金额 >= BZType.补助标准 and People.加班补助=0 and SumBZ.餐别='晚餐'then 0--晚餐无加班补助的,补0元
when SumBZ.就餐金额 >= BZType.补助标准 and SumBZ.餐别='午餐' then BZType.补助标准--午餐全部超过3元的,补3元
when SumBZ.餐别='早餐' then BZType.补助标准--早餐不补
WHEN SumBZ.就餐金额 < BZType.补助标准 THEN 0--未超过补助额度的不补
end
FROM SumBZ INNER JOIN
BZType ON SumBZ.餐别 = BZType.餐别 inner join People On People.卡号=SumBZ.卡号
declare @i int
set @i=(select min(ID) from TempBZ)
while @i<=(select max(ID) from TempBZ)
begin
update SumBZ set 补助金额=(select BZmoney from TempBZ where ID=@i) where ID=@i
set @i=@i+1
end
drop table TempBZ
if (@@error!=0)
begin
rollback tran
return(1)
end
commit tran
end
GO