A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王金凤 黑马帝   /  2011-11-9 21:57  /  2140 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各路大侠,帮忙解释一下,最好附有例子哦……

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

3 个回复

倒序浏览
事务是一种机制、一种操作序列,它包含了一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交

或撤销操作请求,即这一组数据库要么都执行,要么都不执行。特别适用于多用户同时操作的数据库系统。



事务是作为单个逻辑工作单元执行的一系列操作。

一个逻辑工作单位必须有4个属性:

原子性:事务是一个完整的操作,事务的各元素不可再分。所有元素必须作为一个整体提交或回滚。

一致性:当事务完成时,数据必须处于一致状态。

隔离性:对数据进行修改时所有并发事务是彼此隔离的。

持久性:事务完成后,对系统影响是永久性的。



2.创建事务

开始事务:begin transaction

提交事务:commit transaction

回滚(撤销)事务:rollback transaction

  

代码
use studb
go

if exists(select * from sysobjects where name = 'bank')
drop table bank
create table bank
(
    customerName char(10), --顾客姓名
    currentMoney money --余额
)
go
--增加检查约束 账户余额不能小于1
alter table bank
add constraint CK_currentMoney check(currentMoney >= 1)
go
insert into bank values('张三',1000)
insert into bank values('李四',1)

select * from bank

----------------------------------------------------------
--------------- * * * * 事 * * 务 * * * * ----------------
----------------------------------------------------------
use studb
go
set nocount on --不显示受影响的行数信息
PRint '事务之前的数据:'
select * from bank
go

begin transaction
declare @errorSum int
set @errorSum=0

update bank set currentMoney = currentMoney-1000 where customername='张三'
update bank set currentMoney = currentMoney+1000 where customername='李四'

set @errorSum = @errorSum + 1

print '事务中的数据:'
select * from bank

if @errorSum <> 0
    begin
        print '交易失败,回滚事务'
        rollback transaction
    end
else
    begin
        print '交易成功,提交事务,写入硬盘,永久的保存'
        commit transaction
    end
go
print '事务后的数据:'
select * from bank



----------------------------------------------------------
--------------- * * * * 索 * * 引 * * * * ----------------
----------------------------------------------------------
--索引:它是SQL Server编排数据的内部方法
--索引可以分为以下三种;
--唯一索引:不允许两行具有相同的索引值
--主键索引:为表定义主键时自动创建 唯一索引的特殊类型 主键索引要求主键中的每一个值都是唯一的
--聚集索引:表中各行的物理顺序与键值的逻辑(索引)顺序相同,表中只能包含一个聚集索引(可以理解为字典的拼音)。
--非聚集索引:数据和索引包含指向数据存储的相应位置 表中的各行的物理顺序与键值的逻辑顺序不匹配。(可以理解为MAP)
--聚集索引比非聚集索引速度更快
--在一个表中只能有一个聚集索引,但是可以有多个非聚集索引,设置某列为主键该列就默认为聚集索引了。
--表是可以没有索引的,主键索引不一定就是聚集索引。

--索引运用到哪里?
--该列频繁被搜索,该列用于对数据排序
--劣种就几个不同的值,表中就几行数据就没必要使用索引



--语法
--create [unique][clustered|nonclustered] index index_name on table_name (column_name[,column_name]...)
--[
-- with fillfactor = x --填充因子 x 为0~100之间的值
--]



代码
use studb
go

if exists (select [name] from sysindexes where [name]='IX_stuMarks_writtenExam')
drop index stuMarks.IX_stuMarks_writtenExam --查询是否已经存在该索引 如果存在就删除
create nonclustered index IX_stuMarks_writtenExam on stuMarks(writtenExam)
with fillfactor=30 --填充因子 预留空间
go
--查询
select * from stumarks (index=IX_stuMarks_writtenExam)
--会报错 :'index' 附近有语法错误。如果它要作为表提示的一部分,则必须有 WITH 关键字和圆括号,如:
select * from stumarks with(index=IX_stuMarks_writtenExam)
select * from stumarks with(index=IX_stuMarks_writtenExam)  where writtenExam between 60 and 90


----------------------------------------------------------
--------------- * * * * 视 * * 图 * * * * ----------------
----------------------------------------------------------

视图:是一种虚拟表,基于一个表或多个表的数据的查询方法。

一般作用:筛选表中的行、防止未经许可的用户访问敏感数据、将多个物理数据表抽象为一个逻辑数据表

--语法:
--create view view_name
--as
--<select 语句>

代码

use studb
go

if exists(select * from sysobjects where name='view_stuinfo_stumarks')
drop view view_stuinfo_stumarks
go
create view view_stuinfo_stumarks
as
select 姓名=stuname,学号=stuinfo.stuno,笔试成绩=writtenexam,机试成绩=labexam,
平均分=(writtenexam+labexam)/2 from stuinfo left join stumarks on stuinfo.stuno = stumarks.stuno
go

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
其实像这样的问题个人感觉自己从网上搜点资料更快捷方便,这是我的亲身体验
像论坛可以提一些网上比较难找到答案,或者不知道用什么关键词去网上搜的问题,这样大家一讨论,效果可能更好
当然有热心的朋友替你筛选出答案也比较节约时间,但经常自己去搜,能发现很多好的学习资源,比如书籍,论坛,博客等
这只是我的一点点经验.{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨楠 于 2011-11-23 14:40 编辑

事物简单来说,插入100条数据,如果插入到第10条出现问题了,那么前十条插入就回滚,也就是作废了,不会出现10条成功90条失败的混乱状况
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马