总结一下事务的原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结一下事务的原理相关的知识,希望对你有一定的参考价值。


 今晚学习了网易微专业的公开课,讲的是事务的相关的问题。这里写一篇文章记录一下。

 # # 先看一下一个简单版的 spring 的事务原理全貌图

以前文章总结一下事务的原理_spring

 

  对于事务问题,之前都是一知半解。

  之前别人一提到事务,我就想到了ACID。我知道开始事务的注解,知道想要使用注解的时候,就在service层类上添加一个注解@Transactional。我以为这样我就知道事务了。但是我不知道我还不知道很多。

  抛出来第一个问题:那么数据库是通过什么来识别是一个事务的?原理是什么?或者说本质是什么?有没有想过,数据库是怎么识别到底哪些sql 是同一个事务呢?如果让你自己来处理事务,你准备怎么写呢?

  首先回答一下上边的一个问题:数据库和程序交互,是通过同一个数据库连接来判断是不是同一个事务的。如果不用spring给我们提供的事务,让我们自己来实现,其实就是创建一个数据库连接,创建一个事务,然后设置上不要自己提交事务,也就是手动提交,然后再处理,比方说写了一组sql,然后都执行完了就提交事务,如果发生了问题就回滚。

  另外一个问题,如果不同的线程来访问,对于一个数据库连接,是不是事务就失去了隔离性。那么判断同一个数据库链接的,应该放在哪里?不妨学学框架,框架是放在一个TransactionalManager 容器里边,并且这个使用 ThreadLocal 修饰的。ThreadLocal 最大的作用就是用来防治不同的线程访问到同一个变量。使用了ThreadLocal  以后,就解决了不同线程破坏事务隔离的问题。源码里边的 TransactionalManager  也是用来存放数据库连接的。

  每次都通过创建一个事务,最后再提交的方式,能解决问题,但是是不是太粗鲁了?一点都不优雅。想想spring 的 AOP,通过切面的形式,就恰好能帮我们优雅的解决这个问题。就是环绕通知,在方法执行前,创建一个事务,然后方法执行后提交事务。想一下,我们在使用事务的时候,是不是就添加了一个注解@Transaction,其实这个注解就是一个标示,然后在AOP处理里边做一个判断,只要是 用了@Transaction的方法,就统统进行事务的处理。

  到这里就结束了。只不过spring实现的事务,解决更多的问题,更复杂的问题,比方事务的传播呀,等等

   

   

以上是关于总结一下事务的原理的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务(Seata)原理 详解篇,建议收藏

分布式事务(Seata)原理 详解篇,建议收藏

分布式事务(Seata)原理 详解篇,建议收藏

分布式事务(Seata)原理 详解篇,建议收藏

分布式事务(Seata)原理 详解篇,建议收藏

总结一下事务和事务隔离级别