zoukankan      html  css  js  c++  java
  • 事务处理: databse jdbc mybatis spring

             事务的认识需要一个相当漫长的流程,慢慢在实践中理解,然后在强化相关理论基础。
      数据库中的事务:

            传统的本地事务处理都是依靠数据库自身事务处理能力,而事务本身是传统关系型数据库的基石。简单来说事务就是一些满足acid特性的sql,数据库通过锁和日志实现这些机制。国内的mysql中innodb事务引擎引料众多,也有很多文章让我们深刻理解索引和事务的概念。此处简单说一下我的理解;

       A:代表原子性,最好理解,要么全做,要么全不做。

       C:一致性,简单来说就是你扣了50,有人就加了50(一致性本身存在好多种类,传统理解数据库是强一致性)

       I:隔离性,事务之间的可见行,说起来很抽象,其实看看4中隔离性级别,做个实验,就很好理解了。比如市面上大多数数据库默认隔离性级别是读已提交数据,所以只有其他事务提交之后的更新你才能感知到。

    但是这里面有个好玩,也是核心交易创建支付单用来判重用的,如果一个事务A插入一条数据,另外一个事务B插入同一条数据(主键相同),即使另外一个事务没提交,也会抱主键冲突。这个很好玩。可以实验尝试。

      D:持久性,一旦提交,不会丢失。但是谁能保证一定不会丢失呢,天灾人祸。其实这一点,就是把事务日志提交持久化redo日志中,即使断电,内存中数据没有持久化到磁盘,利用redo日志恢复,咋恢复的,以前学习用的ARIES Recovery Algorithm。

        jdbc中的事务

          对于java 程序员而言,是不需要直接使用那些sql操作数据库的,我们使用jdbc, 每个数据库厂商都会为一些编程语言提供驱动,听起来高端,其实就是一个跟数据库通信的api ,内部通过数据库自己的协议通信。jdbc是一个标准接口,每个厂商各自实现,然后对于不同的数据库我们操作起来基本相同。架构如下图,最重要的就是这个Connection,我特地做了试验,想知道它什么东西。在msyql中show processlist 可以查看当前执行的线程,发现其实每个Connection对应一个处理线程,提交事务和回滚事务都是这个Connection处理,当然发送sql和接收结果集合都是它。所以本地事务处理还是靠数据库本身。

      


                jdbc驱动的架构

             

                 jdbc驱动要实现的接口都在jdk中的rt.jar中的package java.sql,idea的中的工具可以直接查看包内的类直接关系,很爽。看下图,当然还有另外一个图,是sql相关的异常,一个项目如何设置一个规范的异常体系,后期花时间总结。

    spring事务处理(有待研究)

      spring 的事务管理最终还是需要依赖数据库自身事务管理,但是它在业务层提供了一个很重要的功能就是事务的传播性。很好玩,一般在开发过程中,我门都是是用默认的传播机制。

         

       分布式事务理论(有待研究)

          CAP:  

          BASE :

         一致性协议:   两阶段,三阶段,paxos方法(zookeeper基于此实现,太复杂不学),raft(号称简单而容易实现的一致性算法,准备细致的看看)

             

        

         

       

  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/5692445.html
Copyright © 2011-2022 走看看