前言
接下來我們將SQL Server基礎(chǔ)系列還剩下最后幾節(jié)內(nèi)容結(jié)束,后續(xù)再來講解SQL Server性能調(diào)優(yōu),我們開始進(jìn)入主題。
SQL Server事務(wù)對(duì)本地變量影響
事務(wù)對(duì)變量影響具體是指什么意思呢,換句話說就是當(dāng)我們回滾事務(wù)和提交事務(wù)之后對(duì)本地變量是否起作用呢,下面我們來看下具體例子。
PRINT '回滾事務(wù)之后測(cè)試'DECLARE @FlagINT INT SET @FlagInt = 1PRINT @FlagInt ---- 此時(shí)變量值為1 BEGIN TRANSACTION SET @FlagInt = 2 ---- 設(shè)置變量值為2 PRINT @FlagInt ROLLBACK TRANSACTION PRINT @FlagInt ---- 此時(shí)變量值為多少? GO PRINT '--------------------'PRINT '提交事務(wù)之后測(cè)試'DECLARE @FlagINT INT SET @FlagInt = 1PRINT @FlagInt ---- 此時(shí)變量值為1 BEGIN TRANSACTION SET @FlagInt = 2 ---- 設(shè)置變量值為2 PRINT @FlagInt COMMIT TRANSACTION PRINT @FlagInt ---- 此時(shí)變量值為多少? GO
通過上述圖我們能夠很清晰的知道:通過改變本地變量值,但是在回滾后和提交后對(duì)變量根本不起作用,所以我們得出結(jié)論:本地變量不受事務(wù)所影響,因?yàn)槠渥饔梅秶艿较拗啤?/span>
SQL Server事務(wù)對(duì)臨時(shí)變量影響
我們首先創(chuàng)建一個(gè)臨時(shí)并插入一條數(shù)據(jù),再來開啟事務(wù)插入一條數(shù)據(jù)并回滾事務(wù)看其結(jié)果如何,具體示例如下:
USE AdventureWorks2012 GO-- 創(chuàng)建臨時(shí)表并插入一行數(shù)據(jù) CREATE TABLE #TempTable (Col1 VARCHAR(100)) INSERT INTO #TempTable (Col1) VALUES('Temp Table - Outside Tran');--查詢臨時(shí)表插入的值 SELECT Col1 AS TempTable_BeforeTransaction FROM #TempTable; BEGIN TRAN-- 插入一行數(shù)據(jù) INSERT INTO #TempTable (Col1) VALUES('Temp Table - Inside Tran'); ROLLBACK-- 查詢臨時(shí)表中的值 SELECT Col1 AS TempTable_AfterTransaction FROM #TempTable; GO-- 刪除臨時(shí)表 DROP TABLE #TempTable GO
從上圖觀察到當(dāng)默認(rèn)插入一條為 Temp Table - Outside Tran 的數(shù)據(jù)時(shí),接下來我們開啟事務(wù)再插入一條為 Temp Table - Inside Tran 的數(shù)據(jù),然后進(jìn)行事務(wù)回滾,此時(shí)回滾之后的數(shù)據(jù)和默認(rèn)插入的數(shù)據(jù)一致,基于此我們得出結(jié)論:臨時(shí)表受事務(wù)影響。
SQL Server事務(wù)對(duì)表變量影響
USE AdventureWorks2012 GO-- 創(chuàng)建表變量并插入一行數(shù)據(jù) DECLARE @TableVar TABLE(Col1 VARCHAR(100)) INSERT INTO @TableVar (Col1) VALUES('Table Var - Outside Tran');--查詢未開啟事務(wù)之前數(shù)據(jù) SELECT Col1 AS TableVar_BeforeTransaction FROM @TableVar; BEGIN TRAN-- 開啟事務(wù)并插入一行數(shù)據(jù) INSERT INTO @TableVar (Col1) VALUES('Table Var - Inside Tran'); ROLLBACK--查詢開啟事務(wù)之后數(shù)據(jù) SELECT Col1 AS TableVar_AfterTransaction FROM @TableVar; GO
當(dāng)默認(rèn)插入一條為 Table Var - Outside Tran 的數(shù)據(jù)后,我們開啟事務(wù)插入一條為 Table Var - Inside Tran 的數(shù)據(jù),接下來再來進(jìn)行回滾發(fā)現(xiàn)其結(jié)果仍為 Table Var - Inside Tran ,至此我們得出結(jié)論:表變量不受事務(wù)所影響。
收縮日志文件
當(dāng)日志文件占滿時(shí),我們可能需要收縮日志文件到最小,那么我們?cè)撊绾巫瞿兀课覀兛梢酝ㄟ^如下三種方式收縮日志文件,請(qǐng)繼續(xù)往下看。
收縮方式一(通過新建查詢語句執(zhí)行)
在SQL Server 2005之前我們可以通過如下做
USE AdventureWorks2012 GO DBCC SHRINKFILE('TruncateLog', 1) BACKUP LOG AdventureWorks2012 WITH TRUNCATE_ONLY DBCC SHRINKFILE('TruncateLog', 1) GO
如果在SQL Server 2005下運(yùn)行上述命令則會(huì)出現(xiàn)如下錯(cuò)誤:
此時(shí)我們應(yīng)該運(yùn)行如下查詢。
USE [AdventureWorks2012] GO ALTER DATABASE [AdventureWorks2012] SET RECOVERY SIMPLE WITH NO_WAIT DBCC SHRINKFILE(AdventureWorks2012_Log, 1) ALTER DATABASE [AdventureWorks2012] SET RECOVERY FULL WITH NO_WAIT GO
此時(shí)運(yùn)行成功將得到如下結(jié)果:
此時(shí)我們?cè)儆益I數(shù)據(jù)庫(kù)屬性將得到我們收縮后最小的日志文件大小,如下:
收縮日志文件方式二(在正確時(shí)間收縮日志文件)
通過右鍵你要收縮的日志文件對(duì)應(yīng)的數(shù)據(jù)庫(kù)的任務(wù)->收縮->文件,如下:
收縮日志文件方式三(完全移除日志文件)
有時(shí)候我們完全不需要大日志文件,此時(shí)我們需要完全移除日志文件來釋放硬盤空間,我們通過以下四步即可達(dá)到我們所需。
(1)分離數(shù)據(jù)庫(kù)
(2)重命名日志文件
(3)重新附加不帶日志文件的數(shù)據(jù)庫(kù)
(4)刪除日志文件
演示如下:
總結(jié)
本節(jié)我們?cè)敿?xì)講解了事務(wù)對(duì)本地變量和表變量不起作用,而對(duì)臨時(shí)表起作用以及當(dāng)日志文件占滿時(shí)我們采取幾種方式來收縮日志,我們下節(jié)開始進(jìn)入SQL Server基礎(chǔ)系列中有關(guān)死鎖的最后幾篇。
http://www.cnblogs.com/CreateMyself/p/6395670.html