您的位置:首页 > 数据库

Day 8(11.15):存储过程(5)--使用事务

2015-11-15 16:53 435 查看
-- 5 ****************************************************

-- 使用事务

-- 事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。

-- 如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。

-- 5.1 --------------------------------------------------

-- 事务的类型

/*

Microsoft? SQL Server? 以三种事务模式运行:

自动提交事务

    每条单独的语句都是一个事务。比如单个的 insert,update,delete 语句。

显式事务

    每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。

    begin tran

       insert ...

       update ...

       delete ...

    commit tran

隐性事务

    在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。

    set implicit_transactions on

*/

-- 5.2 --------------------------------------------------

-- 自动提交事务

/*

use Test

create table dbo.t_Product

(

p_id    int,

p_price int

constraint CK_t_Product check(p_price>=30)

)

insert t_Product values (15,45)

insert t_Product values (16,78)

insert t_Product values (17,60)

insert t_Product values (18,35)

select * from t_Product

*/

update t_Product set p_price=p_price*0.8

select * from t_Product

-- 违反约束的只有一条记录,但是所有的操作都回滚了

-- 5.3 --------------------------------------------------

-- 显式事务

/*

begin tran

   insert ...

   update ...

   delete ...

   if @@error<>0

      begin

         rollback tran

      end

   else

      begin

         commit tran

      end

*/

/*

create database CMB

Go

use CMB

create table dbo.bank

(

user_id      int,

user_balance int

)

insert bank values (5005,5000)

Go

create database BOC

Go

use BOC

create table dbo.bank

(

user_id      int,

user_balance int

)

insert bank values (5005,1000)

Go

select * from CMB..bank

select * from BOC..bank 

*/

use Test

Go

create proc dbo.t_CMB_BOC

@user_id int,

@amount  int

as

begin tran

   update CMB..bank set user_balance=user_balance-@amount where user_id=@user_id

   update BOC..bank set user_balance=user_balance+@amount where user_id=@user_id

   if @@error<>0

      begin

         rollback tran

         return

      end

commit tran

Go

select * from CMB..bank

select * from BOC..bank

exec dbo.t_CMB_BOC 5005,500

use master

alter database BOC set offline

use Test

use master

alter database BOC set online

use Test

-- 5.4 --------------------------------------------------

-- 隐性事务

/*

在查询窗口 1 中,执行:

set implicit_transactions on

  update test..t_Product set p_price=1000

在查询窗口 2 中,执行:

select * from test..t_Product

在查询窗口 1 中,执行:

rollback

在查询窗口 2 中,观看结果

*/

/*

在查询窗口 1 中,执行:

set implicit_transactions on

  select * from test..t_Product

在查询窗口 2 中,执行:

select * from test..t_Product

在查询窗口 1 中,执行:

rollback

*/

-- 可以在查询分析器里设置

-- 工具 -> 选项 -> 连接属性 钩上‘设置 implicit_transactions’全局设置

-- 工具栏 -> 当前连接属性   钩上‘设置 implicit_transactions’窗口设置

-- 练习 --------------------------------------------------

-- 1 Log.dbo.t_log 中记录了一周内的交易记录。

--   编写存储过程,把 Log.dbo.t_log 中久于一周的记录转存到 LogHistory.dbo.t_loghistory 中。不能有记录丢失。

/*

create database Log

Go

use Log

Go

create table dbo.t_log

(

idx int identity(1,1),

from_user varchar(20),

to_user varchar(20),

item varchar(20),

trade_date datetime default(getdate())

)

declare @datetime datetime

select @datetime =getdate()

insert t_log (from_user,to_user,item,trade_date) values ('刘德华','张柏芝','青龙剑',@datetime-10)

insert t_log (from_user,to_user,item,trade_date) values ('张柏芝','刘德华','大灵芝',@datetime-6)

insert t_log (from_user,to_user,item,trade_date) values ('刘备','张飞','1000金币',@datetime-3)

Go

create database LogHistory

Go

use LogHistory

Go

create table dbo.t_loghistory

(

idx int,

from_user varchar(20),

to_user varchar(20),

item varchar(20),

trade_date datetime

)

use Test

select * from Log.dbo.t_log

select * from LogHistory.dbo.t_loghistory

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql server 数据库