SQL 锁的使用

前言:本章讨论多个SQL语句同时执行的必要性和所需的基础设施。

锁是数据库服务器用来控制数据被并行使用的一种机制。当数据库的一些内容被锁定时,任何打算修改(或者可能是读取)这个数据的用户必须等到锁释放。大部分数据库使用以下两种锁策略之一。

策略一:数据库的写操作必须向服务器申请并获得写锁才能修改数据,而读操作必须申请和获得读锁才能查询数据。多用户可以同时读取数据,而一个表(或其他部分)一次只能分配一个写锁,并且拒绝读请求直至写锁释放。

策略二:数据库的写操作必须向服务器申请并获得写锁才能修改数据,而读操作不需要任何类型的锁就可以了查询数据。另一方面,服务器需要保证从查询开始到结束读操作看到一个一致的数据视图(即时其他用户修改,数据看上去也要相同)。这个方法被称为版本控制

这两种方法各有利弊,第一种方法在有较多的并行读取请求和写请求时等待时间过长;如果在修改数据时存在长期运行的查询,则第二种方法也是有问题的。

在常用的数据库服务器中,Microsoft SQL Server采取第一种方法,Oracle采取第二种方法,MySQL则两种方法都包括(取决于使用者对存储引擎的选择)。

锁的粒度

决定如何锁定一个资源时也可以采用一些不同的策略。服务器可能在3个不同级别之一应用锁,或者称为粒度:

表锁:阻止多用户同时修改同一个表的数据。

页锁:阻止多用户同时修改某表中同一页(一页通常是一段2~16KB的内存空间)的数据。

行锁:阻止多用户同时修改某表中同一行的数据。

同样,这些方法各有利弊,表锁需要较少的簿记就可以锁定整个表,但是当用户增多时它会迅速产生不可接受的等待时间。另一方面,行锁需要更多的簿记,但是只要各个用户的兴趣在不同的行,它就能允许多人修改同一个表。

在常用的数据库服务器中,Microsoft SQL Server使用表锁、页锁和行锁,Oracle只有行锁,MySQL使用表锁、页锁和行锁(同样取决于使用者对存储引擎的选择)。在某些情况下,SQL Server会将锁从行锁升级至页锁,再从页锁升级至表锁。然而Oracle数据库从不升级锁。

原文地址:https://www.cnblogs.com/luoshengjie/p/10119113.html

时间: 2024-08-25 14:18:22

SQL 锁的使用的相关文章

SQL锁表解决并发性

在数据库开发过程中,不得不考虑并发性的问题,因为很有可能当别人正在更新表中记录时,你又从该表中读数据,那你读出来的数据有可能就不是你希望得到的数据.可以说有些数据同时只能有一个事物去更新,否则最终显示给用户的数据不是数据库中现存的数据.锁表就限制不同的事物在同一时间内不允许同时操作一张表,实例很简单,可以用select来锁定整张表,那别人就不可能更新或是读取表的记录.select * from dbo.Employee with(holdlock); with关键字来设置锁表的方式.下面是wit

SQL 锁的介绍

锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做

sql锁 事务

1.数据库并发产生的问题.(这里所说的事务就是普通意义的流程,跟数据库的事务不要关联起来) 1)脏读.一个事读取了一个仍然在另一个未提交事务的范畴内的数据.read committed级别可以避免. 2)不可重复读.一个事务中两次相同的查询却返回了不同的数据.这是因为一个事务在读,然后另一个事务修改了数据,这个事务再去读,发现两次数据不一致. 3)幻读.没有锁定所有读取的行. 4)丢失更新. 2.各种锁(解决这些问题). 1)共享锁.用户在读取的时候其他用户可以读取,但是不能修改.select

转自高手关于SQL 锁的叙述。。(nolock,rowlock,tablock,xlock,paglock)

锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: [丢失更新]A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 [脏读]A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 [不可重复读]A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 并发控制的主要方法是封锁,锁就是在一段时间

SQL锁行 解决多台服务器发送统一请求并发问题

锁行信息SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 存储过程:SET Transaction Isolation Level Read语法的四种情况 这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SET Transaction Isolation Level Read UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一介绍: 第一种情况: READ   COMMITTED 这句的作用是: 指定在读取数据时控制共享

sql 锁类型与锁机制

SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁.   2. NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句.   3. PAGLOCK:指定添加页锁(否则通常可能添加表锁).   4. READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描.默认情况下,SQL Server 2000 在此隔离级别上操作.

SQL锁机制和事务隔离级别

摘自:http://www.cnblogs.com/haiyang1985/archive/2009/02/27/1399641.html 锁机制 NOLOCK和READPAST的区别. 1.       开启一个事务执行插入数据的操作. BEGIN TRAN t INSERT INTO Customer SELECT 'a','a' 2.       执行一条查询语句. SELECT * FROM Customer WITH (NOLOCK) 结果中显示"a"和"a&quo

SQL 锁

set transaction isolation level repeatable readBEGIN TRAN Tran_Money select * from CodeType rowlock where CodeTypeID = 'AcceptmentState' UPDATE CodeType SET Memo = '222' WHERE CodeTypeID = 'AcceptmentState' --rollbackCOMMIT TRAN 开启一个事务,锁死一行  当不执行comm

Hiver 操作 MySQL 导致锁表

Hadoop 搬迁到新集群后,操作主库 MySQL 导致了锁表...sad 具体锁表时间点  : 2016-1-14 14:31  到   2016-1-14 14:36 之间 在 oradba 的 innodbstatus 信息拿到后,还需要后续继续分析到底是哪条 SQL 锁的... 参考 Link : http://mysqllover.com/?p=431