spring事务问题分析

  • Post author:
  • Post category:其他



目录


一、spring事务的原理


二、事务容易引发的问题


三、为什么事务执行时间不能太长


四、复杂业务逻辑如何规避事务问题


一、spring事务的原理

spring事务的基本原理是什么,怎么实现的我相信大家应该看过一些书籍的具体介绍。我这边不做太过详细的讲解。我这里重点介绍一下spring事务的几个特性。

1、spring事务实现实际上是通过数据库的事务机制实现的数据回滚等操作。通过切面的方式在代码执行完成之后监听方法是否有抛出异常RuntimeException作为是否commit。

2、spring在事务在代码进入方法的时候开启事务,及开启了链接会占用数据库链接池当中的连接数。当方法执行完成监听到方法结束之后会释放链接。在数据库commit的时候数据库的链接也同步释放。

3、数据库在创建链接之后,根据代码的操作指令针对表单进行操作;插入表单数据则会出现锁表,有更新且更新条件走索引的情况下会出现行锁。当出现删除语句也会出现表锁。(此情况针对mysql,当然其他种类的数据库也是差不多的逻辑)。当代码链接占用期间数据库的锁是不会被释放直到commit提交才会彻底的释放锁。

4、事务的用途:1、可以实现数据的一致性;2、其实可以作为简单的分布式锁使用,由于应用一般都是多节点部署,容易出现分布式部署的数据问题。

二、事务容易引发的问题

针对事务的特性我们很容易发现事务会引发的一些问题,这些问题特别容易出现在高并发场景,且在我们开发过程当中并没有那么容易发现问题。那么具体会出现哪些问题呢?

1、现象:数据库压力不大,但是慢sql非常多,但是应用的借口落地却非常慢,甚至操作一段时间直接卡死不响应。但是测试环境执行非常快,单条数据和执行代码都非常简单。那么问题是什么呢?

问题1:数据库出现了死锁,死锁导致应用连接被占满。为什么出现死锁应为在我们代码当中存在同一时刻两个事务当中存在插入和修改的操作。出现锁抢占死循环的情况。直到数据库默认10min之后超时才会释放链接。

为什么会出现上述问题:上述问题产生的最根本原因是什么呢?原因只有一种可能性就是高并发,如果按照数据库的吞吐量不应该出现这么大的并发量。是由于代码过程当中的事务执行方法和代码非常耗时,从而导致了这种情况的发生。

2、现象:应用响应某一段时间突然间缓慢,数据库的压力非常正常,但是应用cpu非常高,应用内存使用非常正常;

问题2:出现此类问题一般是事务连接占用太多,导致应用连接分配不过来。初始化的链接数不够,导致不断地创建和释放链接。(连接池后续再详细讲解)

为什么上述问题:上述问题的根本原因还是由于开启的事务方法执行时间太长,导致应用吞吐量下降。

3、我列举的知识比较常见的一些系统问题,但是非常难排查。还有诸如间隙锁等情况导致程序的问题。只是想要让大家清除事务会应发各种并发症,大家在实践当中多总结。但是不管怎么变化事务的原理是不会变得,应发的现象也是非常清晰有线路的。

三、为什么事务执行时间不能太长

事务太长会引发的症状:

1、可能会导致应用的数据库 连接池被占用,从而导致应用吞吐量下降;

2、可能会导致数据库出现死锁;

3、可能会导致数据库吞吐量下降,严重的可以导致数据库的不可用。

四、复杂业务逻辑如何规避事务问题

代码开发当中我们如何才能很好地规避这些问题呢?事务其实可以通过缩短事务执行时间。也可以通过补偿机制幂等编码实现数据的最终一致性。

具体的代码开发规范参照;我的上一篇博客

开发代码规范和通过规范避坑_幕风落雨的博客-CSDN博客



版权声明:本文为mufengluoyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。