分布式事务:
一、事务的ACID特性:
事务可以看作等价于Transaction,是指一组连续的操作,这些操作组合成一个逻辑的、完整的操作。
-
原子性A
原子性要求,事务是一个不可分割的执行单元,事务中的所有操作要么全都执行,要么全都不执行。 -
一致性C
一致性要求,事务在开始前和结束后,数据库的完整性约束没有被破坏。 -
隔离性I
事务的执行是相互独立的,它们不会相互干扰,一个事务不会看到另一个正在运行过程中的事务的数据。 -
持久性D
持久性要求,一个事务完成之后,事务的执行结果必须是持久化保存的。
二、分布式事务
分布式事务:一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
例子:一个公司之内,用户的资产分为多个部分,如余额,积分,优惠券等。在公司内部有可能积分功能由一个微服务团队维护,优惠券又是另外的团队维护。这样的话就无法保证积分扣减了之后,优惠券能否扣减成功。
三、解决方案
卡夫卡
JavaNIO和IO区别:
-
IO 面向流每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。
阻塞:当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 -
NIO的缓冲:数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。
NIO则是非阻塞的,每一次数据读写调用都会立即返回,并将目前可读(或可写)的内容写入缓冲区或者从缓冲区中输出,即使当前没有可用数据。
- 简单地说:Java IO当一个inputstream或outputstream在进行read()或write()操作时,是一直处于等待状态的,直到有数据读/写入后才进行处理。而NIO是非阻塞式的,当进行读写操作时,只会返回当前已经准备好的数据,没有就返回空,这样当前线程就可以处理其他的事情,提高了资源的使用率。
dubbo:
MQ架构:
重入锁:
重进入是指任意线程在获取到锁之后,再次获取该锁而不会被该锁所阻塞。
每个锁都关联了一个线程持有者和计数器。
- 线程再次获取锁:锁需要识别获取锁的现场是否为当前占据锁的线程,如果是,则再次成功获取;释放锁时计数器自减,当计数器为0时,锁释放成功。
其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁。
ReentrantLock 构造器的一个参数是 boolean 值,它选择想要一个 公平锁,还是不公平锁。公平锁使线程按照请求锁的顺序依次获得锁。
TryLock():当获取锁时,如果其他线程持有该锁,无可用锁资源,直接返回false,这时候线程不用阻塞等待,可以先去做其他事情;
网友评论