SQL并发处理

  • SQL并发处理已关闭评论
  • 1,020 views
  • A+
所属分类:数据库
广告也精彩
本文预计阅读时间 4 分钟

并发访问的问题:
1丢失更新
2脏读(没有及时更新的数据)
3不一致的分析
4幻想读
锁模式:
共享锁(S锁)、更新锁(U锁)、排他锁(X锁)、意向锁、架构锁、大容量更新锁、键范围锁
锁的使用:
SELECT * FROM table WITH(表级锁定)
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表,行或数据页不再需要时就立即释放
NOLOCK 语句执行时不发出共享锁,允许读“脏数据”
PAGLOCK 在使用一个表锁的地方用多个页锁
READPAST 跳过任何锁定执行事务
ROWLOCK 强制使用行锁代替页锁,盘区锁和表锁等
TABLOCKX 强制使用独占表级锁,这个所在事务期间内阻止任何其他事务使用这个表
UPDLOCK 强制在读表时更新锁而不用共享锁,知道事务结束
例子:
select * from dbo.Tabletest with(HOLDLOCK) --查询数据并上锁
查看数据库中活跃的事务和锁的信息
select request_session_id as sessionid,
resource_type as type,
resource_database_id as dbID,
OBJECT_NAME(resource_associated_entity_id) AS objectname,
request_mode as rmode,
request_status as rstatus
from sys.dm_tran_locks
事务隔离级别
1.READ UNCOMMITTED(未提交数据)
它允许读取已经被其他用户修改但尚未提交确认的数据
2.READ COMMITTED(已提交读)
它通过隐藏未提交的数据变化,解决了读脏数据时的并发数据
3.REPEATABLE READ(可重复读取)
用SELECT命令读取的数据在整个命令执行过程中 由DBMS实施锁定,不会被更改
4.SERIALIZABLE(可串行化)
事务以一种顺序方式连接起来,防止一个事务影响其他事务
*必须将ALLOW_SNAPSHOT_ISOLATION数据库选项设置为ON,才能开始一个使用SNAPSHOT隔离级别的事务。
SET TRANSACTION ISOLATION LEVEL {
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
} 检测
阻塞的回话--sys.dm_os_waiting_taks
select blocking_session_id as '正在阻塞的任务的会话ID',
wait_duration_ms as '等待类型的总等待时间(毫秒)',
session_id as '与任务关联的回话的ID',
blocking_task_address as '当前持有此资源的任务'
from sys.dm_os_waiting_tasks where blocking_exec_context_id is not null
查询回话的信息--DBCC INPUTBUFFERDBCC INPUTBUFFER 会话ID
强制终止会话---KILL
KILL 会话ID
设置等待解锁时间 ---SET LOCK_TIMEOUT
SET LOCK_TIMEOUT 等待的毫秒数
设置死锁的优先级 ---SET DEADLOCK_PRIORITY
SET DEADLOCK_PRIORITY{ LOW | NORMAL | HIGH | <numeric_priority>}

weinxin
九四君博客站长语录
欢迎关注订阅‘爱君娱乐科技’微信公众号,本站的资源也会上传到‘爱君娱乐科技’公众号。
广告也精彩