在微服务环境下,因为会根据不同的业务将拆分成不同的服务,比如会员服务、订单服务、商品服务等等,每个服务都有自己独立的数据库并且是独立运行的,互不影响的。服务与服务之间通讯采用RPC远程调用技术,但是每个服务中都有自己独立的数据源,即自己独立的本地事务;两个服务相互进行通讯的时候,两个本地事务互不影响,从而出现分布式事务产生的原因。
传统项目大部分情况下,不会产生分布式事务,但是在项目中如果采用多数据源的方式就会产生分布式事务;多数据源就是在一个项目中,有两个以上JDBC的连接;多数据源环境搭建分包或者注解方式( Jta-Atomikos);
分布式事务:比如 (图1):用户下单成功后,扣库存失败,那么将导致超卖;如果下单不成功,而扣库存成功,那么将导致少卖。这两种情况都会导致运营成本增加,严重情况下会需要赔付。(SpringCloud解决分布式事务问题 Fegin)
图1
关系型数据库完全满足ACID(刚性事务)的特性。关系型数据库管理系统中事务(transaction)的四个特性:原子性(Atomicity)是指事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生;
一致性(Consistency)是指在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏;就是说数据库事务不能破坏关系型数据库的完整性以及业务逻辑上的一致性;
隔离性(Isolation)多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务的运行效果;
持久性(Durability)意味着在事务完成以后,该事务对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)