搜索
首页数据库mysql教程知方可补不足~Sqlserver中的几把锁和.net中的事务级别

回到目录 当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁

回到目录

当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项

SQL的几把锁

NOLOCK(不加锁)

此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。 

HOLDLOCK(保持锁)

此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。 

UPDLOCK(修改锁)

此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。 

TABLOCK(表锁)

此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。 

PAGLOCK(页锁)

此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。 

TABLOCKX(排它表锁)

此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。

下面看一下.net frameworks平台关于事务级别的枚举,它对应于sql的事件级别

 

<span>namespace</span><span> System.Transactions
{
    </span><span>//</span><span> 摘要:
    </span><span>//</span><span>     Specifies the isolation level of a transaction.</span>
    <span>public</span> <span>enum</span><span> IsolationLevel
    {
        </span><span>//</span><span> 摘要:序列化<span>隔离级别</span>,约束力最高,在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。<br>     // 这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
        </span><span>//</span><span>     Volatile data can be read but not modified, and no new data can be added
        </span><span>//</span><span>     during the transaction.</span>
        Serializable = <span>0</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:可重复读的隔离级别,可能出现幻读,<span>锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,<br>        // 且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。</span>
        </span><span>//</span><span>     Volatile data can be read but not modified during the transaction.New data
        </span><span>//</span><span>     can be added during the transaction.</span>
        RepeatableRead = <span>1</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:不能读但可修改,可能出现不可重复读,指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,<br>        // 从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
        </span><span>//</span><span>     Volatile data cannot be read during the transaction, but can be modified.</span>
        ReadCommitted = <span>2</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:可以读也可以修改,可能出现脏数据,执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。<br>        // 当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。这是四个隔离级别中限制最小的级别。
        </span><span>//</span><span>     Volatile data can be read and modified during the transaction.</span>
        ReadUncommitted = <span>3</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:<span>忽略数据的修改</span>,得到修改前的数据
        </span><span>//</span><span>     Volatile data can be read.Before a transaction modifies data, it verifies
        </span><span>//</span><span>     if another transaction has changed the data after it was initially read.If
        </span><span>//</span><span>     the data has been updated, an error is raised.This allows a transaction to
        </span><span>//</span><span>     get to the previously committed value of the data.</span>
        Snapshot = <span>4</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:
        </span><span>//</span><span>     The pending changes from more highly isolated transactions cannot be overwritten.</span>
        Chaos = <span>5</span><span>,
        </span><span>//</span>
        <span>//</span><span> 摘要:
        </span><span>//</span><span>     A different isolation level than the one specified is being used, but the
        </span><span>//</span><span>     level cannot be determined.An exception is thrown if this value is set.</span>
        Unspecified = <span>6</span><span>,
    }
}</span>

 

对于事务级别的总结

下面是在嵌套事务中经常遇到的情况

  1  脏读:一个事务会读进还没有被另一个事务提交的数据,所以你会看到一些最后被另一个事务回滚掉的数据。

  2  读值不可复现:一个事务读进一条记录,另一个事务更改了这条记录并提交完毕,这时候第一个事务再次读这条记录时,它已经改变了。

  3  幻影读:一个事务用select子句来检索一个表的数据,另一个事务insert一条新的记录,并且符合select条件,这样,第一个事务用同一个select条件来检索数据后,就会多出一条记录。

 

下面是IsolationLevel级别在使用过程中的一些说明(来自博文:http://www.cnblogs.com/CN5135/archive/2011/10/24/2222350.html)

ReadCommitted:
假设A事务对正在读取数据Data放置了共享锁,那么Data不能被其它事务改写,所以当B事务对Data进行读取时总和A读取的Data数据是一致的,所以避免了脏读。由于在A没有提交之前可以对Data进行改写,那么B读取到的某个值可能会在其读取后被A更改从而导致了该值不能被重复取得;或者当B再次用相同的where字句时得到了和前一次不一样数据的结果集,也就是幻像数据。

ReadUncommitted:
假设A事务即不发布共享锁,也不接受独占锁,那么并发的B或者其它事务可以改写A事务读取的数据,那么并发的C事务读取到的数据的状态和A的或者B的数据都可能不一致,那么。脏读、不可重复读、幻象数据都可能存在。

RepeatableRead:
(注意MSDN原文中的第一句话:在查询中使用的所有数据上放置锁,所以不存在脏读的情况)。
假设A事务对读取的所有数据Data放置了锁,以阻止其它事务对Data的更改,在A没有提交之前,新的并发事务读取到的数据如果存在于Data中,那么该数据的状态和A事务中的数据是一致的,从而避免了不可重复的读取。但在A事务没有结束之前,B事务可以插入新记录到Data所在的表中,那么其它事务再次用相同的where字句查询时,得到的结果数可能上一次的不一致,也就是幻像数据。

Serializable:
 在数据表上放置了排他锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行,这是最严格的锁。它防止了脏读、不可重复读取和幻象数据。

 

它的对应表如下:

隔离级别

脏读(Dirty Read

不可重复读(NonRepeatable Read

幻读(Phantom Read

读未提交(Read uncommitted)

可能

可能

可能

读已提交(Read committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable )

不可能

不可能

不可能

 

回到目录

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
sqlserver数据库中已存在名为的对象怎么解决sqlserver数据库中已存在名为的对象怎么解决Apr 05, 2024 pm 09:42 PM

对于 SQL Server 数据库中已存在同名对象,需要采取以下步骤:确认对象类型(表、视图、存储过程)。如果对象为空,可使用 IF NOT EXISTS 跳过创建。如果对象有数据,使用不同名称或修改结构。使用 DROP 删除现有对象(谨慎操作,建议备份)。检查架构更改,确保没有引用删除或重命名的对象。

怎么查看sqlserver端口号怎么查看sqlserver端口号Apr 05, 2024 pm 09:57 PM

要查看 SQL Server 端口号:打开 SSMS,连接到服务器。在对象资源管理器中找到服务器名称,右键单击它,然后选择“属性”。在“连接”选项卡中,查看“TCP 端口”字段。

sqlserver数据库在哪里sqlserver数据库在哪里Apr 05, 2024 pm 08:21 PM

SQL Server 数据库文件通常存储在以下默认位置:Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data可通过修改数据库文件路径设置来自定义数据库文件位置。

Java连接SqlServer错误如何解决Java连接SqlServer错误如何解决May 01, 2023 am 09:22 AM

问题发现这次使用的是SqlServer数据库,之前并没有使用过,但是问题不大,我按照需求文档的步骤连接好SqlServer之后,启动SpringBoot项目,发现了一个报错,如下:刚开始我以为是SqlServer连接问题呢,于是便去查看数据库,发现数据库一切正常,我首先第一时间问了我的同事,他们是否有这样的问题,发现他们并没有,于是我便开始了我最拿手的环节,面向百度编程。开始解决具体报错信息是这样,于是我便开始了百度报错:ERRORc.a.d.p.DruidDataSource$CreateCo

Win11无法安装SQL Server的原因及解决方案Win11无法安装SQL Server的原因及解决方案Dec 27, 2023 pm 07:48 PM

有网友反馈,在win11上无法安装sqlserver这款软件,不知道是怎么回事,根据目前的测试来看,win11存在硬盘问题,部分接口硬盘无法安装这款软件。win11为啥不能安装sqlserver:答:win11不能安装sqlserver是硬盘的问题。1、据了解,win11存在对于硬盘的检测bug。2、这导致sqlserver无法在“三星m.2接口”硬盘上安装。3、因此,如果我们要安装的话,需要准备一块其他硬盘。4、然后将该硬盘安装到电脑里,如果没有额外插槽的话就要换掉之前的硬盘。5、安装完成后,

sqlserver数据库日志怎么查询sqlserver数据库日志怎么查询Apr 05, 2024 pm 09:06 PM

可以通过以下步骤查询 SQL Server 数据库日志:1. 打开 SQL Server Management Studio,连接到数据库服务器;2. 展开“管理”节点,导航到“SQL Server 日志”;3. 选择要查询的日志文件,右键单击并选择“查看日志文件”;4. 浏览日志记录。其他查询日志方法:使用 Transact-SQL 查询、PowerShell Cmdlet。

sqlserver数据库删除了怎么恢复sqlserver数据库删除了怎么恢复Apr 05, 2024 pm 09:33 PM

如果 SQL Server 数据库被删除,可以使用以下方法进行恢复:从备份恢复:如果定期进行备份,按照 SQL Server Management Studio 中的步骤从备份恢复已删除的数据库。使用事务日志恢复:如果启用事务日志记录,按照指定的步骤使用事务日志文件恢复已删除的数据库。使用原始设备恢复:如果物理设备仍然可用,按照指定的步骤使用原始设备恢复已删除的数据库。使用数据恢复工具:如果其他方法无效,可以使用第三方数据恢复工具尝试恢复已删除的数据库。

sqlserver数据库端口号怎么查看sqlserver数据库端口号怎么查看Apr 05, 2024 pm 09:09 PM

SQL Server 数据库端口号可以通过 SQL Server 配置管理器查看:打开 SQL Server 配置管理器。展开 SQL Server 网络配置。选择协议(TCP 或 UDP)。在 TCP Port 字段中查看端口号。常见端口号:TCP 1433(默认)、UDP 1434(默认)、TCP 11433(动态)。如果遇到连接问题,请检查防火墙设置或联系数据库管理员。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!