当前位置: 首页 > 网络应用技术

分析春季数据库事务的典型虐待

时间:2023-03-07 16:34:00 网络应用技术

  数据交易是企业应用程序的核心内容,也是开发人员最有可能犯错误的地方。

  本文解释了使用的一些不良习惯。请注意,它们可以避免一些错误和性能丧失。

  使用服务Internet的错误通常使用模型-View -Controller(MVC)来构建开发环境,因此在控制器中使用服务非常常见。

  为了促进测试,测量了EloleService和RoleListService。我们要在控制器中插入两个字符,并且需要在同一交易中处理两个字符。让我们首先使用服务的约束者给出错误。代码如下:

  包com.learn.ssm.chapter14.controller;/ ****** imports ******* / @controller公共类Rolecontroller {@autowired Privic Roleservice;

  包com.learn.ssm.chapter14.controller;

  /************************************************************************************************************

  @控制器

  公共类rootcontroller {

  @Autowired

  私有Roleservice roleservice = null;

  @Autowired

  私人RolelistService RoleListService = null;

  }

  //方法无交易

  public void ErruseServices(){){)

  角色1 =新角色();

  requ1.setRoleEname(“ cole_name_1”);

  root1.setNote(“ cool_note_1”);

  //带来交易方法

  rootservice.inserstrole(cool1);

  root root2 = new root();

  角色2.setRoleEname(“ requ_name_2”);

  root2.setNote(“ cool_note_2”);

  //带来交易方法

  rootservice.inserstrole(real2);

  }经常在工作中出现类似的代码,即使具有多年开发经验的开发人员也会犯此类错误。这里的问题是,这两种螺母方法根本不在同一交易中。

  当控制器使用服务方法时,如果此服务方法用 @transactional标记,则将启用交易,并且在完成服务方法完成后,它将发布交易,因此两种iSerstrole方法将以两者为单位。在不同的事务中完成。

  以下是该代码测试此代码的日志。您可以清楚地看到它们在同一交易中不存在。

  这样,如果第一个插入成功并且第二插入失败,数据库数据将不会完全成功或同时失败,这可能会导致严重的数据不一致,从而给生产带来严重的损失。

  该示例清楚地告诉您,当将交易方法与交易一起使用时,应该只有一个入口,然后使用通信行为来定义交易策略。

  如果错误地拨打了多个呼叫,则不会在相同的交易中进行,这将导致数据一致性问题在不同时间提交或回滚。

  每个Java EE开发人员都应注意此类问题,以避免不必要的错误。

  长时间占用交易。在企业的生产系统中,数据库交易是最有价值的资源之一。使用数据库交易后,必须及时发布数据库交易,甚至必须评估数据库交易处理业务。

  换句话说,我们应该缩短尽可能多地使用数据库交易的时间来完成所需的工作。为此,我们需要区分需要哪个业务,不需要哪个业务,以及不需要的时间?例如,在工作中,有必要使用文件,外部连接呼叫等以及这些操作通常持续很长时间,不需要交易。在这种情况下,如果开发人员不关注细节,则很容易将系统的倒置。机器问题。支持我们在插入角色后需要操作文件,然后我们希望将插入式方法转换为inserstrole方法,作为一种代码如下。

  假设DosomethingForfile方法是与数据库事务无关的操作,例如处理图片的上传,但作者必须告诉读者这是一个不好的代码。

  当插管方法结束后,Spring将发布数据库事务资源,这意味着在运行DosomethingForfile方法时,Spring不会发布数据库交易资源。Dosomethingforfile方法返回结果后,数据库资源将被关闭。

  在大型互联网系统中,数据库的链接可能约为50,但同时并发请求可能是数十万。

  大多数并发请求都在等待拥有数据库连接资源的50个文件操作。如果平均Dosomething Forfile操作需要1秒钟,对于同时带有1,000个并发请求的网站,请求将出现。

  由于大多数请求都在等待数据库交易的分配,因此这是一个不好的结果,如图1所示。

  图1交易中的文件操作

  从图1可以看出,当操作文件的步骤持续很长时间时,数据库事务将很长一段时间内发布。目前,如果有较高的合并,它将引起大量并发请求以获取数据库的交易资源。系统已关闭。

  在这方面,应将其修改为在控制器层中操作文件,并且代码如下:

  请注意,当程序运行INSERTRORE方法时,Spring将发布数据库事务资源。

  对于DosomethingForfile方法,它已经在没有交易的环境中运行,因此当前请求将不会长时间进行数据库事务,以便将其他并发请求被迫发布。此重写分析如图2所示。

  图2不在事件中的文件操作

  从图2可以看出,操作文件时已关闭交易。目前,操作文件避免了当前请求所占用的数据库事务资源,从而导致其他请求以获取情况。

  实际上,不仅文件操作,系统之间还有一些系统和一些操作可能需要很长时间,因此您必须注意此问题。

  错误捕获异常,以模拟购买产品的代码。其中,产品服务是产品服务类别,Transactionservice是交易信息的记录。需求显然是在同一交易中的同一交易中。库存和保存交易的传播是需要的。现在,让我们看一下以下代码:

  这里的问题是该方法是异常的。由于开发人员不了解春季的事务协议,因此他们添加了自己的……捕获...在两个操作中的声明。

  以这种方式没有错误,但这似乎是多余的。在我们分析Prud commonVice的减少方法之前,没有异常,当出现保存方法时,Transactionservice的保存方法也会向后回滚,但是它将抛出“交易后退后将。仅回滚(交易似乎已经标记为唯一可以回滚)”,这对于某些初级开发人员来说可能很难找到异常原因。

  在那些需要处理大量异常的代码中,我们必须谨慎考虑此类问题,以避免代码并发症并使定位问题非常困难。有时我们确实需要自己处理异常。因此,上述代码已转换。

  请注意,它会引发异常操作,因此在春季交易过程中,它将捕获抛出和滚动的异常。这样,当异常时,它将更有利于定位,这是使用数据库交易的方式。

  ▼

  上述内容来自SSM+REDIS集成和一万人的开发的升级版。

  原始作者:鲍恩观点