`

sql的加锁

阅读更多
<script type="text/javascript"></script> <script></script><script type="text/javascript"></script>
<script></script>
加锁
2009-05-25 14:55

sql 行锁
 
3 优化程序,检查并避免死锁现象出现;
4 .对所有的脚本和SP都要仔细测试,在正是版本之前。
5 所有的SP都要有错误处理(通过@error)
6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁

解决问题 如何对行 表 数据库加锁

八 几个有关锁的问题

1 如何锁一个表的某一行

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM table ROWLOCK WHERE id = 1

2 锁定数据库的一个表

SELECT * FROM table WITH (HOLDLOCK)

加锁语句:
sybase:
update 表 set col1=col1 where 1=0 ;
MSSQL:
select col1 from 表 (tablockx) where 1=0 ;
oracle:
LOCK TABLE 表 IN EXCLUSIVE MODE ;
加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁


几个例子帮助大家加深印象
设table1(A,B,C)
A B C
a1 b1 c1
a2 b2 c2
a3 b3 c3

1)排它锁
新建两个连接
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

2)共享锁
在第一个连接中执行以下语句
begin tran
select * from table1 holdlock -holdlock人为加锁
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran

在第二个连接中执行以下语句
begin tran
select A,C from table1
where B='b2'
update table1
set A='aa'
where B='b2'
commit tran

若同时执行上述两个语句,则第二个连接中的select查询可以执行
而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒

3)死锁
增设table2(D,E)
D E
d1 e1
d2 e2
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30'
update table2
set D='d5'
where E='e1'
commit tran

在第二个连接中执行以下语句
begin tran
update table2
set D='d5'
where E='e1'
waitfor delay '00:00:10'
update table1
set A='aa'
where B='b2'
commit tran

同时执行,系统会检测出死锁,并中止进程

补充一点:
Sql Server2000支持的表级锁定提示

HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别

PAGLOCK 在使用一个表锁的地方用多个页锁

READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

ROWLOCK 强制使用行锁

TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

UPLOCK 强制在读表时使用更新而不用共享锁

应用程序锁:
应用程序锁就是客户端代码生成的锁,而不是sql server本身生成的锁

处理应用程序锁的两个过程

sp_getapplock 锁定应用程序资源

sp_releaseapplock 为应用程序资源解锁

注意: 锁定数据库的一个表的区别

SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除

SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK    不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于 SELECT 语句。
PAGLOCK    在通常使用单个表锁的地方采用页锁。
READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。 READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED 等同于 NOLOCK。
REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。    
ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。
SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX    使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。
UPDLOCK    读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK 的优点是允许您读取数据(不阻塞其它事务)并在以后更新数据,同时确保自从上次读取数据后数据没有被更改。
XLOCK 使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。

使一表在整个处理过程中不会被并发修改
begin tran
select * from 表名 with HOLDLOCK  
--处理语句
commit tran

分享到:
评论

相关推荐

    MySQL 加锁处理分析1

    5. SQL加锁实现分析 文章详细分析了几种不同的SQL查询组合,包括在不同隔离级别下,使用主键、唯一索引、非唯一索引和无索引的情况,展示了每种组合下的加锁行为。例如,使用RC(READ COMMITTED)隔离级别时,非...

    Sql中游标和加锁的问题

    在SQL中,游标(Cursor)和加锁(Locking)是两个重要的概念,它们主要用于处理数据查询和并发控制。游标允许用户在结果集中移动并处理单个记录,而加锁则是为了确保数据的一致性和完整性,防止多个用户同时修改同一...

    MySQL 75道面试题及答案.docx

    死锁问题的解决步骤包括查看死锁日志、找出死锁Sql、分析sql加锁情况、模拟死锁案发、分析死锁日志、分析死锁结果等。 SQL优化可以从多个维度回答这个问题,例如加索引、避免返回不必要的数据、适当分批量进行、...

    MySQL 70 道面试题及答案.docx

    3. 分析 sql 加锁情况 4. 模拟死锁案发 5. 分析死锁日志 6. 分析死锁结果 SQL 优化 SQL 优化需要考虑以下几点: 1. 加索引 2. 避免返回不必要的数据 3. 适当分批量进行 4. 优化 sql 结构 5. 分库分表 6. 读写分离...

    在SQL SERVER中实现加锁功能的方法分析.pdf

    SQL Server数据库系统中,数据加锁是一项至关重要的功能,它确保了数据库在多用户环境下操作的正确性与一致性。加锁技术主要目的是为了实现事务之间的隔离,从而保护数据不被并发操作所冲突,维护数据库的完整性和...

    MySQL 数据库经典面试题解析.docx

    对于死锁问题,排查通常包括查看死锁日志、分析SQL加锁情况、模拟死锁并分析结果。解决方法涉及调整SQL结构、优化事务处理等。 SQL优化是数据库管理员的日常任务。这包括合理添加索引,避免返回不必要的数据,适当...

    100道MySQL数据库经典面试题

    分析SQL加锁情况;模拟死锁情况;分析死锁日志。 - **处理策略**:调整SQL语句顺序;锁定更少的资源;增加超时设置;手动解锁。 3. **SQL优化方法**: - **加索引**:创建合适的索引来提升查询效率。 - **避免...

    mysql:面试题及答案

    9. **SQL加锁分析**:MySQL的锁机制在不同隔离级别下有不同的表现。例如,主键上的锁更精确,而没有索引时可能产生全表扫描。RC(读已提交)和RR(可重复读)隔离级别的锁行为也有所不同,RR可能会导致间隙锁。...

    MySQL加锁处理分析@何登成1

    本节将对一条简单的 SQL 语句的加锁实现进行分析,包括 id 主键+RC、id 唯一索引+RC、id 非唯一索引+RC、id 无索引+RC 八种组合。 七、死锁原理与分析 本节将对死锁原理和分析进行了详细的解释,死锁是 MySQL 加锁...

    100道MySql面试题

    3. 分析 sql 加锁情况 4. 模拟死锁案发 5. 分析死锁日志 6. 分析死锁结果 日常工作中优化 SQL 的方法: 1. 加索引 2. 避免返回不必要的数据 3. 适当分批量进行 4. 优化 sql 结构 5. 分库分表 6. 读写分离 分库与...

    阿里大牛何sir 深入MySQL加锁处理分析

    在深入分析MySQL加锁处理之前,首先...通过掌握不同SQL语句在不同条件下的加锁行为,可以有效预测和解决锁相关的问题。何登成作为资深技术专家,提出的加锁分析方法值得数据库管理者和开发者在实际工作中借鉴和应用。

Global site tag (gtag.js) - Google Analytics