事务传播
在具有事务的方法调用中存在其他的事务,这时候就出现了事务的传播,比如现在我有100块钱,买书,一本60一本50,买的时候需要库存也减少,那么买书的时候也是事务,库存较少也是事务,这就是事务的传播,
事务传播的方式有7种,重要的有两种,用propogetion=require和require_new
前者是一直在同一事物,后者是之前的挂起,开启新事物,那么前者就是总体一致性,后者是局部一致性,
结果是前者一本也买不了,后者可以买一本。
事务隔离
数据库事务的并发问题
脏读:当前事务我读到了其他事务更新但是还未提交的数据。
不可重复读:事务1读取数据,事务2 更改数据,事务1再次读取后的数据与第一次读取的数据不一致。
幻读:事务2增加了行,事务1再次读取的时候发现多读取了1行
读未提交
读已提交
可 重复读(相当于在读的时候给数据上了锁,不可更新但是可以插入数据)
串行化
使用isolation设置事务的隔离级别
redis的持久化的两种形式
RDB全量:快照,所有的内存的数据。fork子进程不影响程序,效率高,很快。节省时间,恢复快
缺点:数据不较大的时候不好。满足的条件比较苛刻,如果没有达到备份的条件是不会全量备份的,中间的数据会全部丢失。
AOF增量(互补)
日志的方式,粒度更细。
所有的写操作重新执行一遍
RDB的话是把数据恢复就行了
什么时候适合创建索引:
索引的缺点是除了查询快,其他的写操作会变慢,因为是堆结构。需要该索引,占用磁盘空间。
频繁查询
外键关联
组合索引
先排序后分组,
JVM的垃圾回收机制
GC
堆里面
由两种
引用计数法(没办法处理循环引用)
复制算法(年轻代),minner 双倍空间。效率高,直接拷贝,无内存碎片
标记清除算法:老年代,清除没有标记的,先标记后清除,内存碎片。
优点 :不需要额外的空间。标记压缩:也是发生在老年代(full gc)
缺点是有移动对象的成本redis在项目中的使用场景;
存储用户信息这样的数据的时候不建议用string,因为需要完全的序列化,用户的信息字符串(id,name.age)get的时候会全部反序列化,而序列化反序列化是是由IO操作的,所以是使用hash
不能重复加好友两次,两个共同的好友,交集等