事务传播

在具有事务的方法调用中存在其他的事务,这时候就出现了事务的传播,比如现在我有100块钱,买书,一本60一本50,买的时候需要库存也减少,那么买书的时候也是事务,库存较少也是事务,这就是事务的传播,

事务传播的方式有7种,重要的有两种,用propogetion=require和require_new

spring事务传播机制对应mysql事务_反序列化


spring事务传播机制对应mysql事务_反序列化_02


前者是一直在同一事物,后者是之前的挂起,开启新事物,那么前者就是总体一致性,后者是局部一致性,

结果是前者一本也买不了,后者可以买一本。

事务隔离

数据库事务的并发问题

脏读:当前事务我读到了其他事务更新但是还未提交的数据。

不可重复读:事务1读取数据,事务2 更改数据,事务1再次读取后的数据与第一次读取的数据不一致。

幻读:事务2增加了行,事务1再次读取的时候发现多读取了1行

spring事务传播机制对应mysql事务_反序列化_03


读未提交

读已提交

可 重复读(相当于在读的时候给数据上了锁,不可更新但是可以插入数据)

串行化

使用isolation设置事务的隔离级别

spring事务传播机制对应mysql事务_反序列化_04

spring事务传播机制对应mysql事务_数据_05


spring事务传播机制对应mysql事务_数据_06


spring事务传播机制对应mysql事务_redis_07


spring事务传播机制对应mysql事务_反序列化_08

spring事务传播机制对应mysql事务_redis_09

redis的持久化的两种形式

RDB全量:快照,所有的内存的数据。fork子进程不影响程序,效率高,很快。节省时间,恢复快

缺点:数据不较大的时候不好。满足的条件比较苛刻,如果没有达到备份的条件是不会全量备份的,中间的数据会全部丢失。

spring事务传播机制对应mysql事务_数据_10


AOF增量(互补)

日志的方式,粒度更细。

spring事务传播机制对应mysql事务_redis_11


所有的写操作重新执行一遍

RDB的话是把数据恢复就行了

什么时候适合创建索引:
索引的缺点是除了查询快,其他的写操作会变慢,因为是堆结构。需要该索引,占用磁盘空间。
频繁查询
外键关联
组合索引
先排序后分组,

JVM的垃圾回收机制
GC

spring事务传播机制对应mysql事务_数据_12

堆里面

由两种

spring事务传播机制对应mysql事务_反序列化_13

引用计数法(没办法处理循环引用)

复制算法(年轻代),minner 双倍空间。效率高,直接拷贝,无内存碎片

标记清除算法:老年代,清除没有标记的,先标记后清除,内存碎片。

spring事务传播机制对应mysql事务_反序列化_14


优点 :不需要额外的空间。标记压缩:也是发生在老年代(full gc)

spring事务传播机制对应mysql事务_反序列化_15


缺点是有移动对象的成本redis在项目中的使用场景;

spring事务传播机制对应mysql事务_反序列化_16

存储用户信息这样的数据的时候不建议用string,因为需要完全的序列化,用户的信息字符串(id,name.age)get的时候会全部反序列化,而序列化反序列化是是由IO操作的,所以是使用hash

spring事务传播机制对应mysql事务_redis_17


spring事务传播机制对应mysql事务_数据_18


不能重复加好友两次,两个共同的好友,交集等

spring事务传播机制对应mysql事务_数据_19