数据库 事物 锁

事物中的锁简单说就是S共享锁,X排它锁

X锁在所有事物中,一旦加上,持续到COMMIT才释放

未提交读 (READ UNCOMMITTED):读取时候不会加共享锁,直接读取

已提交读(READ COMMITTED):读取时候加S锁,读完立马释放S锁,会在事物完成前就立马释放S锁

可重复读(REPEATABLE READ):读取时候加S锁,一直持续到事物提交才会释放S锁,如果中间有数据插入,改模式会读取到插入的数据,会出现幻想

可序列化(SERIALIZABLE):读取时候加S锁,一直持续到事物提交才会释放S锁,但是数据库底层会有机制确保该隔离级别下

所有的操作都是串行,不会出现幻想,因为中间有数据插入,该模式下也读取不到,应该是该模式比REPEATABLE READ

还多了范围锁。

https://www.cnblogs.com/chenmh/p/3998614.html

https://www.cnblogs.com/jackson0714/p/TSQLFundamentals_08.html

https:///www.cnblogs.com/ljhdo/p/5037033.html

可以通过这几篇文章来理解上面几种隔离级别

测试方法,创建一个表,CREATE TABLE [dbo].[Test]

(

[id] [int] IDENTITY(1,1) NOT NULL,//设置主键

[price] [float] NOT NULL,

)

//下面语句可以找出来加锁的事物

select

*,

OBJECT_NAME(resource_associated_entity_id) tableName

from

sys.dm_tran_locks

where

resource_type=‘OBJECT‘

//end

在测试时候会有死锁,用kill pid;来结束;

但是一定要设置:

ALTER DATABASE   [databaseName] SET READ_COMMITTED_SNAPSHOT off;

或者

ALTER DATABASE [databaseName]  SET READ_COMMITTED_SNAPSHOT on  with rollback immediate

//禁用行版本控制模式,就可以测试以上所有的事物特性,和理解的是一样的;如果该选项打开,那么将会用行版本来控制,参考mysql 或者sql server 的MVCC实现机制来理解

sqlserver新版本还有还有MYSQL ,ORACLE等都实现了MVCC机制,在该机制下READ COMMITTED,REPEATABLE READ读取数据时候不会加S锁,而是用了行版本控制来实现一样的效果,但是占用资源会更少,以上流程都是按照数据库标准的悲观锁来设计的,基本主流的的数据库都是按照这个模式来做的。

行版本控制需要使用下面指令来启动行版本控制:

ALTER DATABASE   [databaseName] SET READ_COMMITTED_SNAPSHOT off;

或者

ALTER DATABASE [databaseName]  SET READ_COMMITTED_SNAPSHOT on  with rollback immediate

Read Committed Snapshot和Snapshot Isolation都是通过行版本控制来实现的;

SNAPSHOT快照:SNAPSHOT和READ COMMITTED SNAPSHOT两种隔离(可以把事务已经提交的行的上一版本保存在TEMPDB数据库中)

SNAPSHOT隔离级别在逻辑上与SERIALIZABLE类似
READ COMMITTED SNAPSHOT隔离级别在逻辑上与 READ COMMITTED类似

不过在快照隔离级别下读操作不需要申请获得共享锁,所以即便是数据已经存在排他锁也不影响读操作。而且仍然可以得到和SERIALIZABLE与READ COMMITTED隔离级别类似的一致性;如果目前版本与预期的版本不一致,读操作可以从TEMPDB中获取预期的版本。

如果启用任何一种基于快照的隔离级别,DELETE和UPDATE语句在做出修改前都会把行的当前版本复制到TEMPDB中,而INSERT语句不需要在TEMPDB中进行版本控制,因为此时还没有行的旧数据

无论启用哪种基于快照的隔离级别都会对更新和删除操作产生性能的负面影响,但是有利于提高读操作的性能因为读操作不需要获取共享锁;

MVCC机制

MVCC

MVCC即多版本并发控制,使用了双版本号来解决数据的隔离问题。(“create”一个版本号,“delete”一个版本号,修改操作拆分为“delete”和“create”)每个事务在开始对每张表增删改查操作时都会生成一个版本号,每个事务只能查到“create”小于本版本号和“delete”大于本版本号的数据。这样,增删查操作就完全可以并发进行了,只有修改操作是一定要排队的。这样,就算没有共享锁也解决了不可重复读问题,因为其他事务修改后,数据的版本号比我大,我不会读到。

原文地址:https://www.cnblogs.com/qianyz/p/9833870.html

时间: 2024-10-15 18:13:27

数据库 事物 锁的相关文章

并发编程(四):也谈谈数据库的锁机制

http://www.2cto.com/database/201403/286730.html 1. 数据库并发的问题 数据库带来的并发问题包括: 1. 丢失更新. 2. 未确认的相关性(脏读). 3. 不一致的分析(非重复读). 4. 幻像读. 详细描述如下: 1.1.丢失更新 当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题.每个事务都不知道其它事务的存在.最后的更新将重写由其它事务所做的更新,这将导致数据丢失. e.g.事务A和事务B同时修改某行的值, 事务A

数据库事物

数据库的事物是神马? 事务(transaction)代表一组不可分割的操作,要么全部执行,要么全部不执行, transaction起始于一条DML语句,结束于commit;语句,或者是DCL.DDL语句,在事务未提交前 可以通过rollback回滚事务,正常退出事务会自动提交,非正常退出事务会自动回滚. 北大SQL数据库视频教程事务04 - 视频教程在线观看v.ku6.com/show/E0qbiVBfaErPqdpx.html oracle数据库_DML与事务控制- 视频教程在线观看v.ku6

浅谈数据库的锁

数据库对于程序猿来 并不陌生,但是数据库的锁你知道多少?数据库的锁直接影响数据性能,在大并发的前提下,怎么保证数据不被死锁,提高数据库性能?如何加锁,何时加锁,加什么锁,你可以通过hint手工强行指定,但大多是数据库系统自动决定的.这就是为什么我们可以不懂锁也可以写SQL. 下面我们来简单谈一谈数据库中的锁,以sqlserver 为例: 数据库锁的种类: 1.共享锁(Shared lock) 何为共享锁,顾名思义意思就是资源共享,所以共享锁之间 是没有时间等待的可以同时执行一条或多条查询语句,共

数据库事物四大特性-ACID

转载自:http://blog.csdn.net/logogcn/article/details/6828531 事务的:原子性.一致性.分离性.持久性 事物(transaction)是由一些列操作序列构成的执行单元,这些单元要么都做,要么不做,是一个不可分割的工作单元. 数据库事物的四个基本性质(ACID) 1.原子性(Atomicity) 指的是事物中包含的所有操作要么全做,要么全不做(all or none). 2.一致性(consistency) 在事物开始以前,数据库处于一致性的状态,

ORACLE查询数据库的锁表情况

  查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name FROM v$process p,v$session a, v$locked_object b,all_objects c WHERE p.addr=a.paddr AND a.process=b.process AND c.object_id=b.object_id 如果表因为某些情况出现死

查看Oracle数据库被锁住的表,删除锁表的进程

锁表处理及查询 查看Oracle数据库被锁住的表,删除锁表的进程 1.查看被锁住的表 SELECT dob.object_name table_name,    lo.locked_mode, lo.session_id, vss.serial#, vss.action action, vss.osuser osuser, vss.logon_time, vss.process ap_pid, vps.spid db_pid FROM v$locked_object lo, dba_object

数据库操作锁住

查看Oracle数据库被锁住的表,删除锁表的进程[@[email protected]]查看Oracle数据库被锁住的表,删除锁表的进程 --1.查看被锁住的表SELECT dob.object_name table_name,lo.locked_mode,lo.session_id,vss.serial#,vss.action action,vss.osuser osuser,vss.logon_time,vss.process ap_pid,vps.spid db_pidFROM v$loc

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???

数据库 -- 悲观锁与乐观锁

锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种,也可能是几个小时),数据再发生变化.此时,我们就需要通过一些机 制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓 的 " 锁 " ,即给我们选定的目标数据上锁,使其无法被其他程序修改. hibernate 支持两种锁机制:即通常所说的 " 悲