SqlServer 2012学习笔记

说明:本文为Windows下SqlServer 2012的学习笔记
标签:SqlServer、SqlServer 2012、学习笔记
DB安装:对于Windows下SqlServer 2012的安装本文不再指导,用户可以自行搜索相关文章
温馨提示:如果您发现本文哪里写的有问题或者有更好的写法请留言或私信我进行修改优化

【大纲】
--综合评价
--知识点
--测试数据
--SI模式
--RCSI模式
--重建数据库日志文件


★ 综合评价
////////////////////////////////////////////////////////

  • 个人认为SqlServer是专门为计算机小白设计的,因为它的默认隔离级别下,读和写是相互阻塞的,而Oracle的默认隔离级是可以读写分离的。你也许要好奇了,为什么SqlServer不学Oracle呢?其实SqlServer也有快照隔离技术,但是默认不开启,这是为什么呢?因为它主要针对的用户群体是一些对计算机不那么熟悉的小白,他们往往需要的是简单准确,而不是复杂的高并发,他们需要的就是这种我用时你别碰的做法。因为这样就可以保证数据在别人操作期间的确定性,这样也避免多个人同时操作表导致数据混乱。SqlServer本来就不是给BAT这种需要高并发的企业设计的,所以它的工作机制当然会根据用户群体而进行优化。
  • 综上所述:个人认为SqlServer用来教学和研究数据库原理会比较好,因为Oracle、MySQL等数据库的事务机制是固定的不能调整,而SqlServer在调节事务模式方面则比较方便,加上简单易用以及和Windows的完美衔接使得SqlServer也不失为一件学习利器


★ 知识点
////////////////////////////////////////////////////////
※ implicit_transactions参数为on时,SqlServer关闭自动提交
※ allow_snapshot_isolation(简称SI)保证事务级别的读一致性
※ read_committed_snapshot(简称RCSI)保证语句级别的读一致性
※ SQL Server 数据库默认的事务隔离级别是Read Committed,会话默认的隔离级别是数据库默认的隔离级别,即是Read Committed。但是会话默认的隔离级别受到数据库选项 READ_COMMITTED_SNAPSHOT 的影响,该选项影响Read Committed 隔离级别是使用行版本控制事务的读操作,还是使用加共享锁来控制事务的读操作。虽然用户不能修改数据库默认的隔离级别,但是用户可以修改会话默认的隔离级别。
※ 独占模式(开启/关闭)
    ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE    开启独占访问模式
    ALTER DATABASE dbname SET MULTI_USER    关闭独占模式,恢复多用户模式


★ 测试数据
////////////////////////////////////////////////////////
USE [ZZT]
GO

CREATE TABLE [dbo].[T](
    [id] [numeric](18, 0) NOT NULL,
    [name] [nchar](10) NULL,
    [sex] [int] NULL,
    [country] [nvarchar](50) NULL,
    [city] [nvarchar](50) NULL,
    [tel] [numeric](18, 0) NULL,
    [other] [nchar](10) NULL,
 CONSTRAINT [PK_T] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

USE [ZZT]
GO

CREATE SEQUENCE [dbo].[Seq] 
 AS [bigint]
 START WITH 1
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE  20 
GO

INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'aaa',1,'China','北京',110,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'bbb',0,'China','天津',120,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'ccc',1,'China','湖南',110,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'ddd',0,'China','青岛',110,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'eee',1,'China','大连',110,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'fff',0,'China','上海',110,'哈哈');
INSERT INTO zzt.dbo.t VALUES (next value for dbo.seq,'ggg',1,'China','贵州',110,'哈哈');
commit;


★ allow_snapshot_isolation(简称SI)事务隔离模式
////////////////////////////////////////////////////////
※ 知识点
¤ 写入程序不会阻碍读取程序
¤ 必须为DB启用快照隔离
¤ 必须为连接集事务隔离级别快照启用快照隔离
¤ 更新事务将旧版本的数据保存在一个链表中
¤ 新的隔离级别提供了以下优点:
    提高了只读应用程序的数据可用性
    允许在OLTP环境中执行非阻止读取操作
    可对写入事务进行自动的强制冲突检测

※ 窗口1
--查询数据库隔离状态
select name,
       user_access,
       user_access_desc,
       snapshot_isolation_state,
       snapshot_isolation_state_desc,
       is_read_committed_snapshot_on
  from sys.databases

--开启数据库SI隔离特性
alter database zzt set allow_snapshot_isolation on        

※ 窗口2
set transaction isolation level snapshot;    --开启会话级别的快照隔离(一般会话的隔离级别是悲观模式下的READ COMMITTED)
set implicit_transactions on;    --临时关闭自动提交
 begin transaction a;            --开启事务a
select * from zzt.dbo.t;
update zzt.dbo.t set sex=7 where sex!=0;
select * from zzt.dbo.t;
 commit transaction a;            --提交事务a
select * from zzt.dbo.t;
set implicit_transactions off;    --开启自动提交

※ 窗口3
SELECT *  FROM [ZZT].[dbo].[T]
SELECT *  FROM [ZZT].[dbo].[T] with(nolock)

※ 窗口2
温馨提示:只有commit或rollback后其他会话才能获取到修改后的数据,除非使用nolock
rollback;                        --回滚所有事务(因为自动提交已经关闭)
select * from zzt.dbo.t;        --数据回到修改之前的值

commit;                            --提交所有事务(因为自动提交已经关闭)
select * from zzt.dbo.t;        --数据变成修改之后的值

※ 窗口3
SELECT *  FROM [ZZT].[dbo].[T]
SELECT *  FROM [ZZT].[dbo].[T] with(nolock)

★ read_committed_snapshot(简称RCSI)事务隔离模式
////////////////////////////////////////////////////////
※ 窗口1
--查询数据库隔离状态
select name,
       user_access,
       user_access_desc,
       snapshot_isolation_state,
       snapshot_isolation_state_desc,
       is_read_committed_snapshot_on
  from sys.databases

--开启数据库RCSI隔离特性
alter database zzt set read_committed_snapshot on;

※ 窗口2
set implicit_transactions on;    --临时关闭自动提交
 begin transaction a;            --开启事务a
select * from zzt.dbo.t;
update zzt.dbo.t set sex=7 where sex!=0;
select * from zzt.dbo.t;
 commit transaction a;            --提交事务a
select * from zzt.dbo.t;
set implicit_transactions off;    --开启自动提交

※ 窗口3
SELECT *  FROM [ZZT].[dbo].[T]
SELECT *  FROM [ZZT].[dbo].[T] with(nolock)

※ 窗口2
温馨提示:只有commit或rollback后其他会话才能获取到修改后的数据,除非使用nolock
rollback;                        --回滚所有事务(因为自动提交已经关闭)
select * from zzt.dbo.t;        --数据回到修改之前的值

commit;                            --提交所有事务(因为自动提交已经关闭)
select * from zzt.dbo.t;        --数据变成修改之后的值

※ 窗口3
SELECT *  FROM [ZZT].[dbo].[T]
SELECT *  FROM [ZZT].[dbo].[T] with(nolock)

★ 重建数据库日志文件
////////////////////////////////////////////////////////
--置数据库为单用户模式
alter database db_name set single_user with rollback immediate
go
--重建数据库日志文件
alter database db_name Rebuild Log on (name=log_name,filename='C:\log_name.ldf')
go
--最后设置数据库为多用户模式。
alter database dbname set multi_user


(未完待续……)


※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

over

猜你喜欢

转载自blog.csdn.net/zzt_2009/article/details/106218634
今日推荐