SqlServer註意事項總結,高級程式員必背。

来源:https://www.cnblogs.com/kiba/archive/2018/07/30/9351119.html
-Advertisement-
Play Games

本篇文章主要介紹SqlServer使用時的註意事項。 想成為一個高級程式員,資料庫的使用是必須要會的。而資料庫的使用純熟程度,也側面反映了一個開放的水平。 下麵介紹SqlServer在使用和設計的過程中需要註意的事項。 SqlServer註意事項 Sql事務啟動語句 開始事務:BEGIN TRANS ...


本篇文章主要介紹SqlServer使用時的註意事項。

想成為一個高級程式員,資料庫的使用是必須要會的。而資料庫的使用純熟程度,也側面反映了一個開發的水平。

下麵介紹SqlServer在使用和設計的過程中需要註意的事項。

SqlServer註意事項

Sql事務啟動語句

開始事務:BEGIN TRANSACTION

提交事務:COMMIT TRANSACTION

回滾事務:ROLLBACK TRANSACTION

相關註意事項

保持事務簡短,事務越短,越不可能造成阻塞。

在事務中儘量避免使用迴圈while和游標,以及避免採用訪問大量行的語句。

事務中不要要求用戶輸入。

在啟動事務前完成所有的計算和查詢等操作。

避免同一事務中交錯讀取和更新。可以使用表變數預先存儲數據。即存儲過程中查詢與更新使用兩個事務實現。

超時會讓事務不執行回滾,超時後如果客戶端關閉連接sqlserver自動回滾事務。如果不關閉,將造成數據丟失,而其他事務將在這個未關閉的連接上執行,造成資源鎖定,甚至伺服器停止響應。

避免超時後還可打開事務 SET XACT_ABORT ON統計信息可以優化查詢速度,統計信息準確可以避免查詢掃描,直接進行索引查找。

sp_updatestats可以更新統計信息到最新。

低記憶體會導致未被客戶端連接的查詢計劃被清除。

修改表結構,修改索引後,查詢計劃會被清除,可以再修改後運行幾遍查詢。

DDL DML交錯和查詢內部SET選項將重新編譯查詢計劃。

order by 影響查詢速度。

where中使用函數則會調用篩選器進行掃描,掃描表要儘量避免。

updlock和holdlock同時使用可以在早期鎖定後面需要更新的資源,維護資源完整性,避免衝突。

如果不需要使用臨時表的統計信息來進行大數據查詢,表變數是更好的選擇。

事務使用註意事項

設置事務隔離級別(未提交讀,讀臟),相當於(NOLOCK) 的語句:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

隔離級別描述如下:

1.READ UNCOMMITTED

READ UNCOMMITTED:未提交讀,讀臟數據。

預設的讀操作:需要請求共用鎖,允許其他事物讀鎖定的數據但不允許修改。

READ UNCOMMITTED:讀操作不申請鎖,允許讀取未提交的修改,也就是允許讀臟數據,讀操作不會影響寫操作請求排他鎖。

2.READ COMMITTED

READ COMMITTED(已提交讀)是SQL SERVER預設的隔離級別,可以避免讀取未提交的數據,隔離級別比READ UNCOMMITTED未提交讀的級別更高;

該隔離級別讀操作之前首先申請並獲得共用鎖,允許其他讀操作讀取該鎖定的數據,但是寫操作必須等待鎖釋放,一般讀操作讀取完就會立刻釋放共用鎖。

3.REPEATABLE READ

REPEATABLE READ(可重覆讀):保證在一個事務中的兩個讀操作之間,其他的事務不能修改當前事務讀取的數據,該級別事務獲取數據前必須先獲得共用鎖同時獲得的共用鎖不立即釋放一直保持共用鎖至事務完成,所以此隔離級別查詢完並提交事務很重要。

4.SERIALIZABLE

SERIALIZABLE(可序列化),對於前面的REPEATABLE READ能保證事務可重覆讀,但是事務只鎖定查詢第一次運行時獲取的數據資源(數據行),而不能鎖定查詢結果之外的行,就是原本不存在於數據表中的數據。因此在一個事務中當第一個查詢和第二個查詢過程之間,有其他事務執行插入操作且插入數據滿足第一次查詢讀取過濾的條件時,那麼在第二次查詢的結果中就會存在這些新插入的數據,使兩次查詢結果不一致,這種讀操作稱之為幻讀。
為了避免幻讀需要將隔離級別設置為SERIALIZABLE

5.SNAPSHOT

SNAPSHOT快照:SNAPSHOT和READ COMMITTED SNAPSHOT兩種隔離(可以把事務已經提交的行的上一版本保存在TEMPDB資料庫中)
SNAPSHOT隔離級別在邏輯上與SERIALIZABLE類似
READ COMMITTED SNAPSHOT隔離級別在邏輯上與 READ COMMITTED類似
不過在快照隔離級別下讀操作不需要申請獲得共用鎖,所以即便是數據已經存在排他鎖也不影響讀操作。而且仍然可以得到和SERIALIZABLE與READ COMMITTED隔離級別類似的一致性;如果目前版本與預期的版本不一致,讀操作可以從TEMPDB中獲取預期的版本。

如果啟用任何一種基於快照的隔離級別,DELETE和UPDATE語句在做出修改前都會把行的當前版本複製到TEMPDB中,而INSERT語句不需要在TEMPDB中進行版本控制,因為此時還沒有行的舊數據

無論啟用哪種基於快照的隔離級別都會對更新和刪除操作產生性能的負面影響,但是有利於提高讀操作的性能因為讀操作不需要獲取共用鎖;

5.1SNAPSHOT

SNAPSHOT 在SNAPSHOT隔離級別下,當讀取數據時可以保證操作讀取的行是事務開始時可用的最後提交版本
同時SNAPSHOT隔離級別也滿足前面的已提交讀,可重覆讀,不幻讀;該隔離級別實用的不是共用鎖,而是行版本控制
使用SNAPSHOT隔離級別首先需要在資料庫級別上設置相關選項

5.2READ COMMITTED SNAPSHOT

READ COMMITTED SNAPSHOT也是基於行版本控制,但是READ COMMITTED SNAPSHOT的隔離級別是讀操作之前的最後已提交版本,而不是事務前的已提交版本,有點類似前面的READ COMMITTED能保證已提交讀,但是不能保證可重覆讀,不能避免幻讀,但是又比 READ COMMITTED隔離級別多出了不需要獲取共用鎖就可以讀取數據

SqlServer【鎖】註意事項

一、頁鎖實例

T1: select * from table (paglock)
T2: update table set column1='hello' where id>10

說明
T1執行時,會先對第一頁加鎖,讀完第一頁後,釋放鎖,再對第二頁加鎖,依此類推。假設前10行記錄恰好是一頁(當然,一般不可能一頁只有10行記錄),那麼T1執行到第一頁查詢時,並不會阻塞T2的更新。

----------------------------------------------------------------------------------------------------

二、行鎖實例

T1: select * from table (rowlock)
T2: update table set column1='hello' where id=10

說明
T1執行時,對每行加共用鎖,讀取,然後釋放,再對下一行加鎖;T2執行時,會對id=10的那一行試圖加鎖,只要該行沒有被T1加上行鎖,T2就可以順利執行update操作。

----------------------------------------------------------------------------------------------------

三、整表鎖實例

T1: select * from table (tablock)
T2: update table set column1='hello' where id = 10

說明
T1執行,對整個表加共用鎖。 T1必須完全查詢完,T2才可以允許加鎖,並開始更新。

----------------------------------------------------------------------------------------------------

婚前最後一篇博文,希望婚後的自己還能堅持更新。

----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯,請點擊下右下角的推薦】,非常感謝!
如果您覺得這篇文章對您有所幫助,那就不妨支付寶小小打賞一下吧。 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 常用指令 指令作用 指令 查看/查詢 show,select,desc 創建 create 刪除 drop,delete,truncate 切換/進入 use 添加記錄 insert 查看資料庫列表 show databases; 查看當前資料庫登入的是那個用戶 select user(); 查看當 ...
  • 分類安裝發展順序分為:網狀型資料庫層次型資料庫關係型資料庫面向對象資料庫主流:關係型資料庫關係型資料庫事務transaction: 多個操作被當作一個整體對待• ACID: A :原子性 C :一致性 I :隔離性 D:持久性實體Entity:• 客觀存在並可以相互區分的客觀事物或抽象事件稱為實體。... ...
  • noVNC 是一個 HTML5 VNC 客戶端,採用 HTML 5 WebSockets, Canvas 和 JavaScript 實現,noVNC 被普遍用在各大雲計算、虛擬機控制面板中,比如 OpenStack Dashboard 和 OpenNebula Sunstone 都用的是 noVNC... ...
  • VDEN 使能信號 HSYNC 水平方向的同步信號 VSYNC 垂直方向的同步信號 LED-/LED+ 背光信號 VCLK 時鐘信號 VD0~VD23 數字信號 GPB0輸出為1 驅動程式中: lcd_init: static struct fb_info *s3c_lcd; //定義一個結構體 / ...
  • VxWorks 7 是新一代的嵌入式實時操作系統,全新的架構設計,靈活化的組件配置,高可靠性與安全性,豐富的第三方軟體包,極大的方便用戶的開發和使用。本文對VxWorks7 的功能做個簡要的記錄。 VxWorks 7 平臺和配置 VxWorks 7 內核平臺提供 VxWorks 和 Workbenc ...
  • 1、yum:基於RPM包構建軟體更新機制自動解決依賴關係,軟體包由軟體包庫提供 提供方式:ftp服務:ftp://IP地址/倉庫目錄 Http服務:http :// IP地址/倉庫目錄 本地目錄:file://本地目錄 2、構建本地yum vim /etc/yum.repos.d/hanming.r ...
  • 1、yum配置 yum的配置文件在 /etc/yum.conf $releasever 當前系統的發行版本,$basearch CPU體系,使用命令 arch 查看 2、配置yum源 yum源文件在 /etc/yum.repos.d/ 中 看到 .repo 結尾的文件都是yum文件,其中,CentO ...
  • 1,Startx:切換到圖形界面 2,Pwd:查看當前目錄 3,Whoami:查看當前用戶 4,Cd: 1. 命令格式: cd [目錄名] 2. 命令功能: 切換當前目錄至dirName 3. 常用範例 3.1 例一:進入系統根目錄 命令: 輸出: 說明:進入系統根目錄,上面命令執行完後拿ls命令看 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...