事务是一组数据单元操作的集合,这个集合是一个不可分割的逻辑单元,不是全部执行就是通通不执行。
组成事务的数据库单元只有两种:读取和写入。
T-SQL语言的事务是由BEGIN TRAN命令语句开始,一直执行到COMMIN TRAN提交事务或ROLLBACK TRAN回滚事务为止。期间使用@@ERROR系统函数检查数据库单元操作是否成功。
事务的四大特性(简称ACID):
1,原子性(Atomicity):将事务过程的所有数据库单元操作视为同一项工作,不是全部执行完,就是通通不执行,将它视为一个不可分割的逻辑单元。
2,一致性(Consistency):当事务更改或更新数据库的数据后,在事务之前和之后,数据库的数据仍然需要满足完整性限制条件,维持数据的唯一性。
3,隔离性(Isolation):当执行多个事务时,虽然事务是并发执行,不过,事务之间应该满足独立性。也就是说,一个事务不会影响到其它事务的执行结果或被其它事务所干扰。
4,永久性(Durability):当事务完成执行事务提交后,其执行操作所更动的数据已经永久改变,数据库管理系统不只需要将数据从数据库缓冲区实际写入存储装置,而且不会因任何错误,导致数据的流失。
一般情况下,事务放在存储过程里使用,如下例子:
CREATE PROCEDURE Tran_NewsKPI
@NewsID int = 0
AS
BEGIN TRAN Tran_Click
declare @tran_error int;--标记执行事务时的错误个数
DECLARE @clicknum int;
SET @clicknum =
(SELECT ISNULL(click, 0) AS Expr1
FROM T_News
WHERE (id = @NewsID));
set @tran_error = 0;
if(@clicknum = 0)
begin
UPDATE T_News SET click = 0 WHERE (id = @NewsID);
set @tran_error = @tran_error + @@ERROR;
end
UPDATE T_News SET click = click + 1 WHERE (id = @NewsID);
set @tran_error = @tran_error + @@ERROR;
if(@tran_error > 0)
begin
--出错,事务回滚
rollback tran;
select 0;
end
else
begin
commit tran;--执行成功,提交事务
select 1;
end