SQL Server 事务和锁详解
本文章简单的介绍了关于SQL Server,事务和锁的常见问题与用法同时为初学者提供好的参考意见,有需要的可以参考一下。
最近在项目中进行压力测试遇到了的死锁问题,简言之,如下的代码在 SERIALIZABLE 隔离级别造成了死锁:
代码如下 | 复制代码 |
SELECT @findCount=COUNT(id) FROM MyTable WHERE [fk_related_id]=@Argument IF (@findCount > 0) BEGIN ROLLBACK TRANSACTION RETURN ERROR_CODE END INSERT INTO MyTable ([fk_related_id],…) VALUES (@Argument,…) COMMIT TRANSACTION RETURN SUCCESS_CODE ログイン後にコピー |
SQL Server 中锁的种类(Schema操作就暂时不涉及了)
锁类型 | 描述 |
(Shared Lock) | 用于只读操作数据锁定 |
(Update Lock) | 用于数据的更新,在数据真正的需要更新的时候会申请升级为X锁。 |
X(Exclusive Lock) | 独占锁,用于数据的更改。 |
Key-Range Lock(稍后讨论) | 仅仅在 Serializable 隔离级别保护数据,以避免任何有可能使得本事务第二次读取信息产生错误的数据插入操作 |
各个事务隔离级别下锁的使用
SQL Server 中有四种事务隔离级别,具体的大家去参建 MSDN。下面列出在不同的事务隔离级别下这些锁是如何使用的:
隔离级别 | 读数据锁状态 | 写数据锁状态 | 锁持有时间 |
Read Uncommitted | 不获得任何锁 | 不获得任何锁 | |
Read Committed | 数据获得S锁 | 对于 INSERT、DELETE、UPDATE的执行,获得X锁;对于UPDATE的标记,获得U锁; | 读完即释放,并不持有至事务结束。 |
Repeatable Read | 数据获得S锁 | 对于 INSERT、DELETE、UPDATE的执行,获得X锁;对于UPDATE的标记,获得U锁; | 持有至事务结束 |
Serializable | 数据获得S锁,同时获得Key-Range锁。 | 对于 INSERT、DELETE、UPDATE的执行,获得X锁;对于UPDATE的标记,获得U锁,同时获得Key-Range锁。 | 持有至事务结束 |
我们可以利用这些知识形象说明各个隔离级别下的数据一致性:
Read Uncommitted 级别
(1)脏读
(2)更新丢失
(3)不可重复读
(4)幻读
Read Committed 级别
(1)脏读
(2)更新丢失
(3)不可重复读
(4)幻读
Repeatable Read 级别
(1)脏读
(2)更新丢失
(3)不可重复读
(4)幻读
Serializable 级别
(1)脏读
(2)更新丢失
(3)不可重复读
(4)幻读
我们从上图可以比较直观的看到以下的结论
脏读 | 更新丢失 | 不可重复读 | 幻读 | |
Read Uncommitted | 可能 | 可能 | 可能 | 可能 |
Read Committed | 不可能 | 可能 | 可能 | 可能 |
Repeatable Read | 不可能 | 不可能 | 不可能 | 可能 |
Serializable | 不可能 | 不可能 | 不可能 | 不可能 |
这一篇到此为止,下一篇详细介绍 Key-Range Lock 并分析开篇提到的死锁问题

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Microsoft SQL Server は、Microsoft によって発売されたリレーショナル データベース管理システムです。統合されたビジネス インテリジェンス (BI) ツールを使用してエンタープライズ レベルのデータ管理を提供する包括的なデータベース プラットフォームです。使いやすく、拡張性が高く、高いパフォーマンスを備えています。関連ソフトウェアとの統合度が高く、高い利点があります。 SQL Server データベース エンジンは、リレーショナル データと構造化データに対して、より安全で信頼性の高いストレージ機能を提供し、ユーザーがビジネス向けに可用性とパフォーマンスの高いデータ アプリケーションを構築および管理できるようにします。

SQLServer それとも MySQL?最新の調査により最適なデータベースの選択が明らかに 近年、インターネットやビッグデータの急速な発展に伴い、データベースの選択は企業や開発者にとって重要な課題となっています。多くのデータベースの中でも、最も一般的で広く使用されている 2 つのリレーショナル データベースである SQL Server と MySQL は、非常に物議を醸しています。では、SQLServer と MySQL のどちらを選択すればよいでしょうか?最新の研究により、この問題が明らかになりました。まず、

インターネットの普及に伴い、Web サイトやアプリケーションの開発は多くの企業や個人の主要なビジネスになりました。 PHP と SQLServer データベースは 2 つの非常に重要なツールです。 PHP は動的な Web サイトの開発に使用できるサーバー側スクリプト言語であり、SQL Server は Microsoft によって開発されたリレーショナル データベース管理システムであり、幅広いアプリケーション シナリオを備えています。この記事では、PHPとSQL Serverの開発とそのメリット、デメリット、活用方法について説明します。まず、しましょう

PDO を使用して Microsoft SQL Server データベースに接続する方法の概要: PDO (PHPDataObjects) は、PHP が提供するデータベースにアクセスするための統合インターフェイスです。これには、データベースの抽象化レイヤーを実装したり、大量のコードを変更せずに異なるデータベース タイプを簡単に切り替えたりできるなど、多くの利点があります。この記事では、PDO を使用して Microsoft SQL Server データベースに接続する方法を紹介し、関連するコード例をいくつか示します。ステップ

Web 開発では、PHP と MySQL の組み合わせが非常に一般的です。ただし、場合によっては、SQL Server などの他の種類のデータベースに接続する必要があります。この記事では、PHP を使用して SQL Server に接続する 5 つの異なる方法について説明します。

SQL Server と MySQL: 高可用性アーキテクチャにはどちらのデータベースが適していますか?今日のデータ主導の世界では、信頼性が高く安定したシステムを構築するために高可用性が必須の 1 つです。データのストレージと管理の中核コンポーネントとして、データベースの高可用性は企業の業務運営にとって極めて重要です。多くのデータベースの中で、SQLServer と MySQL が一般的な選択肢です。では、高可用性アーキテクチャの観点から見ると、どのデータベースがより適しているのでしょうか?この記事では 2 つを比較し、いくつかの提案を示します。

インターネットの継続的な発展に伴い、データベースの選択はますます重要になってきています。多くのデータベースの中でも、SQLServer と MySQL の 2 つは注目度の高いオプションです。 SQLServer は Microsoft によって開発されたリレーショナル データベース管理システムであり、MySQL はオープンソースのリレーショナル データベース管理システムです。では、SQLServer と MySQL の間で最適なデータベース ソリューションを選択するにはどうすればよいでしょうか?まず、これら 2 つのデータベースをパフォーマンスの観点から比較できます。 SQLサーバーが処理中です

SQLServer と MySQL: モバイル アプリ開発にはどちらが適していますか?モバイル アプリケーション市場の急速な発展に伴い、開発者にとってモバイル アプリケーション開発に適したデータベース管理システムを選択することがますます重要になっています。多くの選択肢の中で、SQLServer と MySQL は開発者に好まれる 2 つのデータベース システムです。この記事では、これら 2 つのデータベース システムを比較して、どちらがモバイル アプリケーション開発に適しているかを判断することに焦点を当て、コード例を通じてその違いを示します。 SQLサーバーはマイクロソフトです
