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
*/
-- 使用事务
-- 事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。
-- 如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。
-- 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
*/
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- Oracle 手动创建数据库步骤详解
- 分割超大Redis数据库例子