mysql-innodb的事务管理与锁

典型的事务场景:下单、转账

事物的定义:事务是DBMS执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成

MYSQL中支持事务的数据引擎:innodb ndb

1、数据库事务的四大特性是什么?

原子性 Atomicity 由undo log保证

一致性 Consistent 数据完整性

查看更多

netty源码分析之PipeLine

重读总结:

  • 事件传播方法,以fireChannelActive()为例,这个方法是定义在ChannelInboundInvoker接口中的,AbstractChannelHandlerContextDefaultChannelPipeline两个类中都重载了这个方法,两者实现的区别是:
    • AbstractChannelHandlerContext中的重载是从当前的Pipeline节点开始传播事件,一般用于业务逻辑处理结束后继续传播事件,下一节点需要查找
    • DefaultChannelPipeline的逻辑是用于事件刚要进入pipeline的时候,下一节点直接指定,In事件指定给head,out事件指定给tail
查看更多

mysql-innodb的索引

数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询更新数据库表中数据

索引类型:normal普通索引、unique唯一索引、全文索引

  • 普通索引:也叫非唯一索引,没有任何的限制
  • 唯一索引:要求索引的键值不能重复,另外,主键索引是一种特殊的唯一索引,比唯一索引多了一条限制。即键值不能为null
查看更多

netty源码分析之服务端启动

重读总结:

  • 想要更好的理解服务启动流程,就要明白netty的线程模型——reactor模型,主线程负责接受新连接,只监听主线程selector上注册的ACCEPT事件
  • 主通的生命周期为 创建——初始化——注册——绑定
    • 创建,就是通过反射调用 默认的构造函数,创建一个NioServerSocketChannel对象
查看更多

netty源码分析之异步编程

netty的异步编程模型

异步编程的目标是:提交一个任务给线程池,在任务执行期间,提交者可以执行其他的逻辑,当提交的任务执行完成,通知提交者来获取执行结果

netty 异步任务的实现Future/Promise异步模型,

模型定义了几个接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface Future<V> extends java.util.concurrent.Future<V> {
boolean isSuccess();
boolean isCancellable();
Throwable cause();
Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);
Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners);
Future<V> sync() throws InterruptedException;
Future<V> syncUninterruptibly();
Future<V> await() throws InterruptedException;
Future<V> awaitUninterruptibly();
boolean await(long timeout, TimeUnit unit) throws InterruptedException;
boolean await(long timeoutMillis) throws InterruptedException;
boolean awaitUninterruptibly(long timeout, TimeUnit unit);
boolean awaitUninterruptibly(long timeoutMillis);
V getNow();
boolean cancel(boolean mayInterruptIfRunning);
}
1
2
3
4
5
6
7
8
9
10
11
12
public interface ChannelFuture extends Future<Void> {
Channel channel(); // 实现类需要持有channel引用
boolean isVoid(); // 如果该实现类是一个Future<Void>
ChannelFuture addListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
ChannelFuture removeListener(GenericFutureListener<? extends Future<? super Void>> listener);
ChannelFuture removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners);
boolean isSuccess(); // 当且仅当io操作成功返回true
boolean isCancellable(); // 当且仅当io操作被cancel方法取消,返回true
ChannelFuture sync() throws InterruptedException; // 等待这个future直到它完成为止,如果future失败,则重新抛出失败的原因。
ChannelFuture await() throws InterruptedException;// 等待这个future的完成
}

查看更多

netty源码分析之定时任务的的优化

1、时间计算上的优化

ScheduledFutureTask使用一个成员变量deadlineNanos记录定时任务延迟执行的时间,所以延时时间是从创建任务开始计算的。

考虑以下两种情况:

  1. 第一次创建ScheduledFutureTask时,需要先将ScheduledFutureTask类加载到虚拟机中
  2. 所有定时任务执行完成之后,JVM内存中不再有ScheduledFutureTask对象引用,下一次full gc时,ScheduledFutureTask类的元信息也会被释放掉,只有再创建定时任务需要执行类加载流程
查看更多

netty源码分析之线程模型

一个NioEventLoop对应于Reactor模型中的一个从Reactor线程,它持有一个Thread引用,可以简单将NioEventLoop理解为一个用于处理channel事件的线程。

一个channel上的事件只能被同一个线程处理,NioEventLoop线程对channel事件的处理是一个串行化无锁执行过程,netty在初始化channel的时候在pipeline中添加了一系列用户指定的Handler(通过childHanler()方法),这些Handler的处理需要遵循一个固定的顺序,netty底层使用同一个线程按照这个顺序串行执行,避免了多线程处理同一个channel需要使用锁同步产生的开销,这叫串行化无锁编程

一个NioEventLoop可以处理多个channel的就绪事件,即同一个nio线程可以处理多条连接的请求,这叫多路复用

1、Channel指定evenloop

Channel的EventLoop是在注册的时候指定的,netty服务器启动时,首先会注册一个ServerChannel,该注册工作由Boss线程池完成,通常Boss线程池中只有一个线程。

1
2
3
4
5
6
// AbstractBootstrap
final ChannelFuture initAndRegister() {
...
ChannelFuture regFuture = config().group().register(channel);
...
}

查看更多

epoll高效运行的原理

nio非阻塞牛逼在哪里?

要解答这个问题首先要清楚bio的痛点在哪里。

假如我们的服务使用bio模型,服务器启动之后需要一条线程一直监听端口上是否有连接请求发过来,如果没有请求,这条线程就一直等着;

等了好久好久终于来了一个请求连接,连接建立成功后,又要开始等业务请求,由于网络慢或者其他原因又等了一千年;

终于拿到了请求,电光火石间处理完拿到响应数据,准备响应出去,这时候发现由于不明原因,一千五百年之前的一条响应还没有发送出去,占据了内核缓冲区,这时候害得等,等前一条响应发出去才能将本次的响应写入缓冲区。。。沧海桑田

查看更多

git规范的commit message(转)

git上每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。

1
2
3
4
5
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>

其中,Header 是必需的,Body 和 Footer 可以省略。

不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。

Header(必需)

查看更多