前言

接下來我們將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ì)本地變量是否起作用呢,下面我們來看下具體例子。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn) 

通過上述圖我們能夠很清晰的知道:通過改變本地變量值,但是在回滾后和提交后對(duì)變量根本不起作用,所以我們得出結(jié)論:本地變量不受事務(wù)所影響,因?yàn)槠渥饔梅秶艿较拗啤?/span>

SQL Server事務(wù)對(duì)臨時(shí)變量影響

我們首先創(chuàng)建一個(gè)臨時(shí)并插入一條數(shù)據(jù),再來開啟事務(wù)插入一條數(shù)據(jù)并回滾事務(wù)看其結(jié)果如何,具體示例如下:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

從上圖觀察到當(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ì)表變量影響

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

當(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之前我們可以通過如下做

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

USE AdventureWorks2012
GO
DBCC SHRINKFILE('TruncateLog', 1)
BACKUP LOG AdventureWorks2012 WITH TRUNCATE_ONLY
DBCC SHRINKFILE('TruncateLog', 1)
GO

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

如果在SQL Server 2005下運(yùn)行上述命令則會(huì)出現(xiàn)如下錯(cuò)誤:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

此時(shí)我們應(yīng)該運(yùn)行如下查詢。

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xù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

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

此時(shí)運(yùn)行成功將得到如下結(jié)果:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

此時(shí)我們?cè)儆益I數(shù)據(jù)庫(kù)屬性將得到我們收縮后最小的日志文件大小,如下:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

收縮日志文件方式二(在正確時(shí)間收縮日志文件)

通過右鍵你要收縮的日志文件對(duì)應(yīng)的數(shù)據(jù)庫(kù)的任務(wù)->收縮->文件,如下:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

收縮日志文件方式三(完全移除日志文件)

有時(shí)候我們完全不需要大日志文件,此時(shí)我們需要完全移除日志文件來釋放硬盤空間,我們通過以下四步即可達(dá)到我們所需。

(1)分離數(shù)據(jù)庫(kù)

(2)重命名日志文件

(3)重新附加不帶日志文件的數(shù)據(jù)庫(kù)

(4)刪除日志文件

演示如下:

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

總結(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