您的位置:首页 > 数据库

.Net_05_事务的基本语法(Sql 语句)

2013-01-28 15:04 316 查看
事务
就是将一推脚本代码放在一起,并将其作为一个整体
可以控制这些代码执行完成以后,是否保留执行结果
还是执行代码以后,就和没有执行一样(不起效果)

语法:

begin transaction --开启一个事务

  --其后的所有代码都是一个整体,表示可以使用一定语句限制这些代码是否起作用
  begin try
    --sql 语句

    commit;--表示事务提交

  end try

  begin catch
    rollback;--表示回滚
  end catch

go

begin transaction
declare @myError int;
set @myError = 0;
begin try
update bank set balance=balance - @balance where cid=@from;
update bank set balance=balance + @balance where cid=@to;
commit;
set @res = 1; --表示成功
end try
begin catch
rollback;
set @res = 0; --表示失败
end catch
go


另一种方式:

begin transaction
declare @myError int;
set @myError = 0;
update bank set balance=balance - 1000 where cid='0001';
set @myError = @myError + @@ERROR;
update bank set balance=balance + 1000 where cid='0002';
set @myError = @myError + @@ERROR;
if(@myError > 0)
begin
rollback
end
else
begin
commit
end;
go


在正常情况下数据库的处理均是事务
  -> 我们执行的一个插入,删除等等一系列操作,每一句话都是一个事务(SQL Server 默认)
  -> 事务处理是一个原子操作
    -> 只有提交以后,数据才会受影响
  -> 异常,出错以后会爆红,表示执行代码有问题
    -> 即使使用@@error变量记录出错信息,但是这么执行在C#中就是异常
    -> 考虑异常代码块
  -> 在使用事务的时候容易出现锁的概念
    -> 如果一个数据表在被修改,那么这张表就得到了“排他锁”
    -> 如果一个数据在读取一张表,那么这张表就得到了“共享锁”

共享锁(S锁):

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排他锁(X锁):

如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

简要说明为什么会发生死锁?解决死锁的主要方法是什么?

若干事务相互等待释放封锁,就陷入无限期等待状态,系统就进入死锁

解决死锁的方法应从预防和解除的两个方面着手:

(1)死锁的预防方法:①要求每一个事务必须一次封锁所要使用的全部数据(要么全成功,要么全不成功)②规定封锁数据的顺序,所有事务必须按这个顺序实行封锁。

(2)允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事物撤消,回滚这个事务,并释放此事务持有的封锁,使其他事务继续运行。

(3)对数据库添加分布式应用,进行读写分离能有效的减低死锁的概率!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: