SQLServer事务与锁

SQLServer事务与锁

最近在做一个项目,因为项目需求要设备信息跟数据库信息同步并且要保存数据的正确性,使用了SQLServer的两个功能:事务和锁。
功能前景:设备的信息要跟数据库同步,数据是关联多张表的,数据里面有代码(数据库自动生成)
数据库自动生成代码我们是利用获取最后一条数据的代码然后加1实现的,所以自动生成代码的功能是有缺陷的,假如项目前台同时执行一个SQL语句,那么这两条数据的代码就是一样的,所以为了防止这样的意外数据,我们采用了SQLServer的锁机制。下面解释一下锁:
SQLServer中有常用有5种锁,分别是NOLOCK、HOLDLOCK、UPDLOCK、TABLOCK、TABLOCKX

  • NOLOCK 语句执行时不发出共享锁,允许脏读

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

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

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

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

同时在分享在网上找的查看锁和解锁的语句
查看锁

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName 
from sys.dm_tran_locks where resource_type='OBJECT'

解锁:
创建一个临时Table
代码如下 复制代码

CREATE TABLE #HarveyLock
(SPID INT,
DBID INT,
OBJID INT,
INDID INT,
TYPE VARCHAR(100),
RESOURCE VARCHAR(100),
MODE VARCHAR(100),
STATUS VARCHAR(100)
)

将Lock信息存入该Table

INSERT INTO #HarveyLock EXEC SP_LOCK

下面分享一下事务
写法:
每个事务均以 BEGIN TRANSACTION 语句显式开始,
以 COMMIT 或 ROLLBACK 语句显式结束。
当以COMMIT结尾就是提交事务
当以ROLLBACK结尾就是撤回
下面是运用的例子:
我写两个事务,当一个事务正在运行时另一个事务无法获取表的数据

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值