积极答复者
两个小问题

问题
答案
-
事务是必须的,就算你不用, sql server 在处理时, 也会自己开事务
openrowset 是一个访问其他数据的操作接口, 就像你在程序中, 为什么能够访问 oracle 呢?
- 已标记为答案 starrycheng 2012年12月3日 8:47
-
所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???:
SQL会在两个时候写数据文件,但是无论哪个时候都会先写事务日志
(1)
严格来讲,SQLSERVER不是直接将日志记录写入日志文件里的,中间还有一层日志记录缓存。SQL会将修改所产生的日志记录
写入日志记录缓存区,而SQL又会保证缓存区里的内容很及时地写入日志文件,哪怕有任何意外发生(包括掉电,服务异常)
所以对用户来讲,可以粗略理解为在任何insert/update/delete提交之前,SQL都必须将他所对应的日志记录写入日志文件里
每次写的数量和数据的修改量有关,这种技术叫write ahead logging
当SQLSERVER做checkpoint (检查点)的时候,需要将内存缓冲区中已经发生过修改的数据页面同步到硬盘中的数据文件里
一般情况下,SQL会以一分钟左右(默认值)的间隔 (这个值可以在下图里设置一般默认值就行了)做checkpoint。如果数据库
上的修改比较多,checkpoint的频率会高一些,反之会低一些。做checkpoint的时候,会发生数据文件的写操作。写的数量和
上次checkpoint以来发生的数据修改量有关
(2)
当SQLSERVER buffer pool内存数据缓存区有压力的时候,会触发lazy writer懒惰写入,主动将内存里的一些很久没有使用过
的数据页面和执行计划清空。如果这些页面上发生的修改还未有checkpoint写回硬盘,lazy writer会将其写回,这个时候会发生
数据文件的写操作。写的数量和lazy writer需要清空的数据页面有直接关系,也就是说,和内存的缺口(内存的大小)和SQL
自己的数据修改量有关系
不使用“事故”也是这样的吗???
就是LZ你不显式指定BEGIN TRANSACTION
SQLSRVER默认都已经开启了事务
说到事务就要说到事务隔离级别,SQLSERVER有四个事务隔离级别:未提交读,已提交读,可重复读,可序列化。SQLSERVER 的默认事务隔离级别是已提交读
已提交读的意思是:指定语句不能读取已由其他事务修改当尚未提交的数据。其他事务可以在当前事务的各个语句之间更改数据
就是说,一条语句运行完毕就会自动提交事务
未提交读隔离级别和已提交读隔离级别都是一条语句运行完毕就会自动提交事务,只是未提交读可以读取已由其他事务修改但尚未提交的行,就是说允许脏读
说得有点多了
LZ可以看一下msdn上的解释
http://msdn.microsoft.com/zh-cn/library/ms174377.aspx
openrowset:
是访问OLEDB数据源的接口,你可以使用openrowset来访问access或者oracle等数据库
详细的解释LZ也可以看一下MSDN
OPENROWSET (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms190312.aspx
- 已编辑 Steven.桦仔 2012年12月1日 5:38
- 已建议为答案 Molly Chen_Moderator 2012年12月3日 3:38
- 取消建议作为答案 starrycheng 2012年12月3日 8:47
- 已标记为答案 starrycheng 2012年12月3日 8:47
-
不错不错,桦仔水平长进了。
补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。
另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。
想不想时已是想,不如不想都不想。
- 已建议为答案 Molly Chen_Moderator 2012年12月3日 3:38
- 已标记为答案 starrycheng 2012年12月3日 8:47
全部回复
-
事务是必须的,就算你不用, sql server 在处理时, 也会自己开事务
openrowset 是一个访问其他数据的操作接口, 就像你在程序中, 为什么能够访问 oracle 呢?
- 已标记为答案 starrycheng 2012年12月3日 8:47
-
所有的数据库操作都是先进入“日志文件”,然后再进入“数据库文件”的吗???:
SQL会在两个时候写数据文件,但是无论哪个时候都会先写事务日志
(1)
严格来讲,SQLSERVER不是直接将日志记录写入日志文件里的,中间还有一层日志记录缓存。SQL会将修改所产生的日志记录
写入日志记录缓存区,而SQL又会保证缓存区里的内容很及时地写入日志文件,哪怕有任何意外发生(包括掉电,服务异常)
所以对用户来讲,可以粗略理解为在任何insert/update/delete提交之前,SQL都必须将他所对应的日志记录写入日志文件里
每次写的数量和数据的修改量有关,这种技术叫write ahead logging
当SQLSERVER做checkpoint (检查点)的时候,需要将内存缓冲区中已经发生过修改的数据页面同步到硬盘中的数据文件里
一般情况下,SQL会以一分钟左右(默认值)的间隔 (这个值可以在下图里设置一般默认值就行了)做checkpoint。如果数据库
上的修改比较多,checkpoint的频率会高一些,反之会低一些。做checkpoint的时候,会发生数据文件的写操作。写的数量和
上次checkpoint以来发生的数据修改量有关
(2)
当SQLSERVER buffer pool内存数据缓存区有压力的时候,会触发lazy writer懒惰写入,主动将内存里的一些很久没有使用过
的数据页面和执行计划清空。如果这些页面上发生的修改还未有checkpoint写回硬盘,lazy writer会将其写回,这个时候会发生
数据文件的写操作。写的数量和lazy writer需要清空的数据页面有直接关系,也就是说,和内存的缺口(内存的大小)和SQL
自己的数据修改量有关系
不使用“事故”也是这样的吗???
就是LZ你不显式指定BEGIN TRANSACTION
SQLSRVER默认都已经开启了事务
说到事务就要说到事务隔离级别,SQLSERVER有四个事务隔离级别:未提交读,已提交读,可重复读,可序列化。SQLSERVER 的默认事务隔离级别是已提交读
已提交读的意思是:指定语句不能读取已由其他事务修改当尚未提交的数据。其他事务可以在当前事务的各个语句之间更改数据
就是说,一条语句运行完毕就会自动提交事务
未提交读隔离级别和已提交读隔离级别都是一条语句运行完毕就会自动提交事务,只是未提交读可以读取已由其他事务修改但尚未提交的行,就是说允许脏读
说得有点多了
LZ可以看一下msdn上的解释
http://msdn.microsoft.com/zh-cn/library/ms174377.aspx
openrowset:
是访问OLEDB数据源的接口,你可以使用openrowset来访问access或者oracle等数据库
详细的解释LZ也可以看一下MSDN
OPENROWSET (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms190312.aspx
- 已编辑 Steven.桦仔 2012年12月1日 5:38
- 已建议为答案 Molly Chen_Moderator 2012年12月3日 3:38
- 取消建议作为答案 starrycheng 2012年12月3日 8:47
- 已标记为答案 starrycheng 2012年12月3日 8:47
-
不错不错,桦仔水平长进了。
补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。
另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。
想不想时已是想,不如不想都不想。
- 已建议为答案 Molly Chen_Moderator 2012年12月3日 3:38
- 已标记为答案 starrycheng 2012年12月3日 8:47
-
不错不错,桦仔水平长进了。
补充一点,事务隔离级别不止这四个,还有快照隔离级别和使用行版本控制的已提交读快照隔离级别(READ_COMMITTED_SNAPSHOT)。
另外,下一代SQL Server 支持的Hekaton内存数据库就不需要写日志了。
想不想时已是想,不如不想都不想。
- 已编辑 Jacky_shen 2012年12月3日 4:08
-
http://research.microsoft.com/en-us/projects/main-memory_dbs/
Please click the Mark as Answer button if a post solves your problem!