事务和权限的一些知识点

事务

set XACT_ABORT --指定当tansact-SQL语句出现运行时错误时,SQL Sever是否自动回滚到当前事务

例子:
BEGIN TRANSACTION
set XACT_ABORT ON
DO Something.....
ROLLBACK TRAN
COMMINT TRAN

事务隔离级别越高,只允许一个事务来操作某张表
事务的并发性越高,安全性越低
提交读(默认情况下)
可重复性读
可串行读(事务之间相互完全隔离)

脏读:
放置一个事务读到另外一个事务还没有提交的记录
某个事务在执行过程中未提交,但是过程中另外一个事务来取这个数据,就出现了未提交读,也称脏读

不可重复读
一个事务在自己没有更新数据库数据的情况下,同一个查询操作执行两次或多次的结果应该是一致的,如果不一致
就说明为不可重复读

丢失更新
如果两个事务都要更新数据库一个字段x

2)幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。


还是上面的例子,事务A要两次读取表T的中数据,虽然设置   repeatable   read     可以防止事务B对数据进行修改,但是事务B却可以向表T中插入新的数据。如何防止这个问题,我们可以考虑设置最高的事务隔离级别   set   tran   isolation   level   serializable。于是乎,事务B就只能乖乖的等待事务A的提交,才能想表T中插入新的数据,从而避免了幻读!


隔离级别                未提交相关性(脏读)          不一致分析(不可重复读)      幻读

提交读                       否                            是                        是
可重复读                     否                            否                        是
可串行读                     否                            否                        否


幻读和不可重复读的区别?

不可重复读的重点是修改 :
同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样

封锁协议有三级。
  一级:当某一事务在修改数据时加独占锁(exclusive locks, write locks),直到事务结束(提交或者回滚)释放。因为不能同时对某一数据进行修改,所以一级封锁协议可防止丢失更新。但是读取数据时没有加任何锁,它还是可以读取加了独占锁的数据,所以不能防止脏读不可重复读。
  二级:在一级封锁基础上事务读数据时加共享锁(shared locks , read locks),读取之后释放(共享锁范围是每次读取)。二级封锁协议可防止丢失更新,脏读。不能防止不可重复读。

  三级:在一级封锁基础上事务读数据时加共享锁,直到事务结束释放(共享锁范围是整个事务)。三级封锁协议可防止丢失更新,脏读,不可重复读。



权限

一般的Sa为登陆名,而dbo为用户名
如果sa希望操作某个库,必须将sa映射到dbo这个用户名,才可以进行操作,否则光有登录名是不管用的

而dbo还必须分配一个权限,点击属性进行添加,
而如果一个公司有500个人,那是否要分配500个用户名呢?这样很累,就引用了组 引申到角色的这个概念

EXEC SP_ADDLOGIN '需要建的登录名' ,'需要设置的密码' 
EXEC SP_GREANTDBACCESS '刚才新建的登陆名','需要新建的用户'
EXEC SP_ADDROLE '需要新建的角色名'
EXEC SP_ADDROLEMEMBER '刚才建的角色名','刚才建的用户'
GRANT UPDATE ON TABLENAME TO '刚才新建的角色名'
GRANT SELECT ON TABLENAME TO '刚才新建的用户'

这样配置一个登陆账户,就实现了



一个让人有兴趣的存储过程例子:

if object_id('testP','p') IS NOT NULL
       drop proc testP
Go
create proc testP
@a int,@b int
as
select @a/@b

exec testP  @b=3,@a=9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值