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结尾就是撤回
下面是运用的例子:
我写两个事务,当一个事务正在运行时另一个事务无法获取表的数据