20220223

分布式事务(分段事务) redis mysql

数据库最终的目的就是一致性,原子性、隔离性和持久化都是为了保证一致性。

为了解决脏读问题又不影响性能,mysql引入mvcc(为了读写不阻塞)(multi-version concurrency control)通过生成快照(读已提交语句级快照,可重复读事务级快照),读取的时候生成一个中间版本号,等其他事务提交了才会读取最新的版本数据。读取select * from table for update 需要间隙锁来解决幻读问题。串行隔离级别最高,只允许事务之间串行执行。mvcc实际上是通过read view 和undo log实现的。

索引:将无序的数据变成有序加快检索速度(B+树)。红黑树(二叉查找树一个node只能存储一个key和一个value)。B树非叶子节点也存储数据,遍历需要跨层检索麻烦些。B和B+树不一样,node存储更多信息,高度更低。B+树数据都在叶子节点,非叶子存索引,更加矮壮,叶子节点组成链表便于遍历查询。

分:1、聚集(聚簇)索引,B+树的叶子节点存的是主键+当前行的数据;2、非聚簇索引,B+树的叶子节点存的是主键和当前索引列值。

哈希索引是innodb自动优化创建。回表,是走索引拿到索引列+数据主键,根据主键拿到数据。

联合索引和最左匹配(从最左边为起点连续匹配遇到范围查询终止)原则。

非自增主键,插入效率低(索引是有序的树,尽可能短)。

mysql默认是可重复读级别的隔离,而互联网公司一般用read commit级别。

mysql优化:

1、是否能使用覆盖索引减少回表,select指明列;2、考虑联合索引,考虑最左匹配原则(区分度最高放最左);3、表达式和函数操作 索引失效;4、子查询优化分页场景;5、explain看sql的执行计划,show profile看资源损耗;6、开启事务后,尽可能减少锁的时间。

java nio(非阻塞)三个核心:buffer(缓冲区)、channel(管道)、selector(选择器)。

io是阻塞的。

多线程:保证原子性(atomic包)、操作可见性(volatile)、对线程的控制(countdownlatch/semaphore)、集合用java.util.concurrent包、synchronized无法满足(lock包)

CAS(compare and swap)比较并交换,三个操作,当前值A、内存值V、修改为B,如果A=V改成B,如果不相等则放弃或者重试。synchronized每次只允许一个线程操作,CAS是不加锁的。ABA问题,如果这个V被修改两次(原来10,改成100,又改成10)问题。java提供atomicstampedreference类给我们用,就是前一个10跟后一个10版本不一样。

分布式事务:

1、两阶段提交(2pc)方案;

2、eBay事件队列方案;

3、tcc补偿模式;

4、缓存数据最终一致性;

分布式事务和常见的分布式事务包括 2PC、3PC、TCC、本地消息表、消息事务、最大努力通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值