数据库锁分类及事务的特性

1.数据库锁

1.1.按锁的粒度划分

表锁,行锁,页锁
1.1.1.表锁
表级锁会直接锁定整张表。表级锁是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免死锁问题。当然,锁定颗粒度大所带来负面影响就是出现争用锁定资源的概率也会最高,致使并发度大大降低。
总结:优点:安全,冲突少。缺点:并发小
1.1.2.行锁
行级锁仅对指定的记录加锁。行级锁最大的特点就是锁定对象的颗粒度小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生争用锁定资源的概率也最小,能尽可能大的提高数据库的并发处理能力从而提高高并发应用系统的性能。虽然行级锁能够极大提高并发处理能力,但是由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。
总结:优点:多个事务可同时执行,缺点:并发大,容易发生死锁
1.1.3.页锁
页级锁是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。
在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。
总结:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

1.2按锁级别划分

共享锁(读锁),排他锁(写锁),意向锁
1.2.1.共享锁(读锁):
事务在查询时给相应的记录加上共享锁(可以是行锁也可以是表锁)其他事务可以读但不可以写
1.2.2.排他锁(写锁)
事务在更新事务的时候给他加上排他锁,其他事务既不可以查询,也不可以修改
1.2.3.意向锁
例:事务1正在进行增删改查操作,已经加锁,事务2想进行操作(事务1加的行锁,事务1加的表锁)。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高

2.数据库事务的特性

数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

2.1事务特性(四种)

⑴ 原子性(Atomicity)
  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

⑵ 一致性(Consistency)
  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

⑶ 隔离性(Isolation)
  隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
  ⑷ 持久性(Durability)
  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

2.2.不考虑隔离性可能产生的问题

1,脏读
  脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据
2,不可重复读
  不可重复读是指在对于数据库中的某条数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了
3,虚读(幻读)
  事务是对数据库结果集进行查询的时候,另一个事务对数据库表进行了添加删除,再次查询,发现结果集增加或减少

解决方法,数据库为我们提供了四种隔离级别

2.3.隔离级别

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
数据库锁分类及事务的特性

2.4.事务的分类

如果事务是单阶段事务,则该事务被视为本地事务,并且由数据库直接处理。 当事务由事务监视器协调并使用防故障机制(如两阶段提交)进行事务解析时,该事务被视为分布式事务。

2.4.1.分布式事务

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。
例:
库存和订单两个独立的微服务,每个微服务维护了自己的数据库。在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。
正常情况下,两个数据库各自更新成功,两边数据维持着一致性。
数据库锁分类及事务的特性

但是,在非正常情况下,有可能库存的扣减完成了,随后的订单记录却因为某些原因插入失败。这个时候,两边数据就失去了应有的一致性。
数据库锁分类及事务的特性

这种时候必须要保证数据的一致性。单数据源的一致性依靠单机事务来保证,多数据源的一致性就要依靠[分布式事务]。
在开发过程中使用多个数据库也可以称为分布式事务(mysql,oracle。。。。)
漫解:https://mp.weixin.qq.com/s?src=11&timestamp=1587649647&ver=2296&signature=TQKd-VFOQlQXuRYgFcK2M8kSqcSBltLtVDqzpsVxP20-PmV3lmgpamC2U4mTnC9jAxIA1Hq6XmBk4FYGY3c4IA8kThiHs82uJ2PHYGnRbfou34YKlkQ6tSnJZ4zZkmRp&new=1

2.4.2.本地事务

本地事务也称为数据库事务或传统事务(相对于分布式事务而言)。它的执行模式就是常见的:

transaction begin
insert/delete/update…
transaction commit/rollback
本地事务有这么几个特征:

一次事务只连接一个支持事务的数据库(一般来说都是关系型数据库)
事务的执行结果保证ACID
会用到数据库锁