分布式事务

在JAVA中事务指的是一系列操作,而事务需要满足四个特性

  • 原子性:指的是一个事务就是一个最小的单位,不可分割

    • sql中为了保证事务的原子性,使用了undo-log,也就是回滚日志,它会记录你操作数据库改变数据之前的数据,当你回滚时直接将undo-log中的数据设置回去
  • 一致性:指的是事务中的所有操作要么全部成功,要么全部失败

    • 一致性要求任何写到数据库的数据都必须满足于预先定义的规则(比如余额不能小于0、外键约束等),简单来说就是在任何时间点都不能出现违反一致性要求的状态。
  • 持久性:事务一旦成功,它数据库中数据的改变是永久性的

    • 持久性使用的是redo-log,在事务提交前只会涉及到redo-log的持久化,而不会设计到数据库的持久化,当事务一旦提交,数据就会持久化。
  • 隔离性:事务之间是相互隔离的,当前事务不能影响其他事务

    • SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

      • 读未提交

        • 读未提交指的是在一个事务中可以读取到其他事务还没有提交的数据,这样就会涉及到脏读,因为其他事务没有提交的数据可能会回滚,那么这个数据就不存在,也就是读到了脏数据

        image-20210815155539616

        通过图表可以看到,在事务1中插入的数据回滚了,数据库中应该没有A,B数据,但是事务2中查询到了这两条数据,这就是脏读,使用读提交隔离级别可以解决脏读

      • 读提交

        • 和名字一样,读取已经提交了事务的数据,但是这个隔离级别会造成不可重复读,不可重复读指的是一个事务两次查询数据间其他事务添加了或者修改了数据,这造成了一次事务中两查询的数据不同

        image-20210815155605079

        从图表可以看出在事务1开始后查询数据期间,事务2提交了添加数据的事务,事务1第二次查询数据得到的数据和第一次查询的数据不同,使用可重复读的隔离级别可以解决

      • 可重复读

        • 指的是在一个事务中多次查询数据得到的数据相同
      • 串行

在单体应用中事务的特性很好保证。而在分布式应用中,事务的


Comments: