sqlserver 数据库排它锁_mysql事务和锁相关概述

一:事务的四大特性(ACID)

1.原子性:不可分割,要么全部执行,要么全部失败回滚,失败回滚后,数据库的状态与改事务执行之前的数据库状态相同。不存在中间状态(部分成功或部分失败)

注意:在事务执行过程中是存在部分成功状态的,只是当在后续的执行过程中,倘若遇到了失败状态,那么之前的部分成功状态将被回滚,导致整个事务被回滚

例:A有500,B有200 A转账B 300。 最终的结果只有两个 要么转账成功,A剩200,B变500 ,要么转账失败,A,B余额都不变

2.一致性:在事务执行前后,整个数据库处于一致状态,保持数据的完整性。即事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

3.隔离性:即在事务存在并发的情况下,每个事务之间感觉不到对方的存在,互不干扰。

4.持久性:务提交以后,数据是永久保存在系统(数据库)中的,即使发生断电等故障

二:事物的隔离级别

1.读未提交(Read Uncommitted) :又被称为脏读,即一个事务读到另一个事务还没有提交的数据;可能出现的问题有脏读、不可重复读、幻读

9a57441ab332e7a2f94b707fab56d1b1.png

2.读已提交(Read Committed) : 又称不可重复读,即一个事务读到了另一个事务已经提交的数据。为Oracle、Sql Server等数据库的默认隔离级别,可能出现的问题有不可重复读、幻读。

6d5dab0ef3aca1b4d1d61a8c7653dfb2.png

3:可重复读(Repeated Read) :又称幻读,Mysql默认的隔离级别,幻读是事务非独立执行时发生的一种现象。例如事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻读。 幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。可能出现的问题幻读。

313c6bfde51ce372a6d25897581527c7.png

4:串行化(Serializable):MySQL数据库中隔离级别最高、最严格,避免了脏读、不可重复读、幻读的发生,但相应的,对数据库的性能会造成一定的影响

三:数据库锁(事务锁)

1.锁是为了解决什么问题

锁在数据库中其功能之一也是用来实现事务隔离性。而事务的隔离性其实是用来解决脏读,不可重复读,幻读几类问题

2.mysql锁分类

84c02dfae2e1e01137badfee41f5ad7d.png

3.

A---模式分类

(1)悲伤锁

悲观锁是基于一种悲观的态度类来防止一切数据冲突,它是以一种预防的姿态在修改数据之前把数据锁住,然后再对数据进行读写。在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后下一个人数据加锁才可对数据进行加锁,然后才可以对数据进行操作。悲观锁认为在操作数据时会出现数据冲突,每次都要通过获取锁才能对相同数据进行操作,所以悲观锁需要耗费较多的时间。共享锁和排它锁是悲观锁的不同实现,都属于悲观锁的范畴。

(2)乐观锁

乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁(这使得多个任务可以并行的对数据进行操作),只有到数据提交的时候才通过一种机制来验证数据是否存在冲突。

乐观锁最常用的实现方式是用数据版本(Version)记录机制。数据版本即为数据增加一个版本标识,一般通过在数据库表中增加一个数字类型的 “version” 字段实现。读取数据时将version字段值一同读出,数据每更新一次,对version值加1,提交更新时将数据库表对应记录的当前version值与已取出的version值进行比对,如果数据库表当前version值与已取出的version值相等,则可以更新,否则认为是过期数据。

通常在实际项目中涉及金钱类的可能会使用这种乐观锁。

B---范围类

(3)表锁

表锁是指上锁的时候锁住的是整个表,当下一个请求访问该表的时候,必须等前一个请求释放了所才能进行对表进行访问;

(4)行锁

行锁是指上锁的时候锁住的是表的某一行或者多行记录,其他请求访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问;

C---算法类

(1)记录锁

记录锁是在索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;防止任何其他事务 插入、更新 或 删除 t.c1=10 的行。

(2)间隙锁

间隙锁(gap)是索引记录之间上的锁,或者说第一个索引记录之前或最后一个索引记录之后的间隔上的锁。例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;阻止其他事务插入t.c1 = 15的记录,不管是否已经有这种值在本列中,因为这个范围内的所有值都被上锁了

(3)临键锁

NK锁是记录锁和间隙锁的组合,锁定一个范围,并且锁定记录本身。对查询范围进行加锁,在另一个事务执行插入操作时是不被运行的,从而避免了幻读。用于解决幻读问题。InnoDB默认的事务隔离级别是Repeatable Read,此时InnoDB使用NK锁进行搜索和索引扫描,防止产生幻读。

D---属性类

(1)共享锁

共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加持写锁。

(2)排它锁

排他锁又称写锁,简称X锁;当一个事务为数据加上写锁时,其他请求将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁

8462334adc06489b7f2bab95fa5fbc34.png

E-----状态锁

意向锁是一种允许行锁与表锁共存的表锁。意向锁是由数据库引擎维护的,用户无法手动操作。在为数据行加 共享锁 / 排它锁 之前,InooDB 会先获取该数据行所在数据表的对应 意向锁。意向锁只会阻塞全表请求,主要目的是展示正在锁定表中一行,或者将要锁定一行。

(1)意向共享锁

事务有意向对表中的某些行加共享锁(S锁)

(2) 意向排它锁

事务有意向对表中的某些行加排它锁(X锁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值