什么是sqlserver中的事务?
1、按照图中说演示的,我们新建一个 存款表.
里面有两个用户. 分别是id,姓名以及对应的余额.
select * from 表_存款

2、现在我们假设一下.
李冬冬要问黄少明借1000块钱.
我们需要怎么样用sql语句完成呢?

3、update 表_存款 set 余额=余额-1000 where id =1;
update 表_存款 set 余额=余额+1000 where id =2;
select * from 表_存款
这些sql语句我们都学过.
把id1的余额减掉1000.
再把id2的余额加上1000.
4、那么新的问题出现了,如果李冬冬又问黄少明借5000块钱呢?
结果出现了负数,这是非常离谱的事情.
所以我们可以给余额字段设置不得少于0.

5、点击设计表.然后点击添加CHECK约束.
这样子就等于做了一个限制余额那一列无论是增加还是修改必须大于等于0.
我们关闭保存修改之后的表结构,这个约束就生效了.


6、我们恢复到之前的表数据,再来进行转账一次,看看效果.

7、现在我们再来转账5000试试.
==========================================
消息 547,级别 16,状态 0,第 1 行
UPDATE 语句与 CHECK 约束"余额>=0"冲突。该冲突发生于数据库"geek",表"dbo.表_存款", column '余额'。
语句已终止。
(1 行受影响)
==========================================

8、出现了上面的提示..减去5000的失败了.但是增加5000的操作却成功了.
这是不是太危险了?如果现实银行中出现这样的问题是致命的.

9、这种情况,我们就需要引入一个叫做事务的概念来解决这个问题.
事务是什么意思呢?
简单来说:就是我要完成好几个事情,这几个事情必须都成功.只要期中有一个事情失败了,那么前面成功的事情都无效.
10、比如第一件事情,我要减掉id1卡里面的5000.
第二件事情,我要增加id2卡里面的余额为5000.
这两件事情通过事务必须都成功,才算有效.
如果有一件事情,失败了.就算为无效操作. 全部恢复到操作之前的数据.
最通俗易懂的形容:一手交钱一手交货.
要么全成功,要么全失败,决不允许一个失败,一个成功.
我们还是恢复到之前的数据.

11、在我们的sql server中. 默认每一条sql语句都是事务.
事务是为了保证数据安全.
早期的时候,人们只愿意使用sqlserver和oracle.而不愿意使用mysql.
因为早期mysql不支持事务.
12、begin transaction 开启事务
commit transaction 提交事务
rollback transaction 回滚事务
事务其实就这三个关键字.
在需要一次性完成很多事情之前,先开启事务. 其实就是相当于一个游戏的保存点.
如果其中所有的事情都正确完成,就提交事务,数据库才真正数据生效.
有一件错误了,就回滚事务,回到了游戏那个保存点.
13、现在我们开启事务.然后给id1增加10000.
我们再来查询一下

14、发现id1的余额增加了1万.但其实这个事务还没有结束呢.
必须回滚或者提交之后才算真正结束.这个数据现在只是在一个地方临时保存着.

15、我们现在回滚一下事务,再查询,发现又回到之前的数据了.
这样子一个事务就算有头有尾了.
如果我们选择了commit transaction
那么这个事务是真正的变成数据库数据了,而不是临时保存.
别人也就可以真正查询到了.

16、我们在sqlserver中. 用sql语句把这个过程完整的写了一下.
首先我声明一个变量.
每次执行一次我就累加.
如果结果为2就提交事务否则回滚事务.
然后查询一下结果,原封不动.那么我们再改成2000试试.
=====================================
begin transaction
declare @影响行 int;
update 表_存款 set 余额=余额-2000 where id=1;
set @影响行=(select @@ROWCOUNT);
update 表_存款 set 余额=余额+2000 where id=2;
set @影响行+=(select @@ROWCOUNT);
if(@影响行 = 2)
begin commit transaction end
else
begin rollback transaction end
select * from 表_存款;

17、转账成功.

18、事务会涉及到一个
共享锁(读)
排它锁(增删改)
事务的介绍就到这里.详细的话可以查看MSDN看一下事务隔离级别.