mysql lock && tx.
Lock
https://tool.4xseo.com/a/24067.html
锁分类:
对数据操作的粒度分
- 表锁:操作时,会锁定整个表
- 行锁:操作时,会锁定当前行
- 间隙锁:操作时,锁定范围条件内的记录
对数据的操作类型分
读锁(共享锁):针对同一份数据,多个读操作可以同时进行不会互相影响
写锁(排他锁,也叫独占锁):当前操作没有完成之前,会阻塞其他写锁或读锁
在开启事务的且自动提交为关闭的状态下`
select for update
和 update
会创建 排他锁
,
如果带有索引查询,则会加行锁
,如果查询整个表,则会加间隙锁
lock table
session 1
lock table my_table read;
select * from my_table;
unlock tables;
sessoin 2
select * from my_table;
update my_table set id = 1; -- will blocked until session 1 unlock tables
lock record
session 1
-- session a |
session 2
set @@autocommit=0; |
session 1
先执行的话 session 2
的查询for update
更新会被锁住
Tx
steps
|
ISOLATION
READ_UNCOMMITED
READ_COMMITED
REPEATABLE-READ
可重复读,但会幻读(读取到新加入的行)
READ_PHANTOM
serialization
LOCK
Spring websocket.
EntryPoint
|
ali-player-decrypt.
AliyunVodEncryption加密分析
阿里云点播API文档地址
预定义伪代码
covert
|
AES
//AES加密,模式为CBC,填充方式:PKCS5Padding |
返回参数说明
PlayInfoList.PlayInfo[0]
{ |
逻辑分析
假设视频文件的AES key
为 realKey
浏览器生成一个随机串 r1
利用RSA
公钥加密,结果为randStr
服务器接受到randStr
,利用私钥解密出随机串 r1
把r1
利用MD5
生成数字摘要,再截取(8,24)位的字符串 记为rs1
convert(rs1)
得到第一段加密的IV
和KEY
,记为KEY1
,IV1
再生成一段随机字符串记为r2
,利用AES.encrypt(r2,KEY1,IV1)
得到上面返回结果中的 Rand
拼接r1 + r2
,利用MD5
生成数字摘要,再截取(8,24)为的字符串,记为rs2
convert(rs2)
得到第二段加密的KEY
,记为KEY2
利用AES.encrypt(realKey,KEY2,IV1)
得到上面返回的结果Plaintext
至此,整个加密逻辑分析完毕
解密TS文件
用到的工具EasyICE
,DVB Inspector
,tsduck
ts-header(32byte)
字段名 | 位数 | 说明 |
---|---|---|
sync_byte | 4bit |
TS package 标识,固定值0x47 |
transport_error_indicator | 1bit |
传输错误标识 |
payload_unit_start_indicator | 1bit |
PES包开始标识,可以用掩码0x40 判断 |
transport_priority | 1bit |
传输优先级 |
PID | 13bit |
TS package identity 0x100:视频数据 ,0x101:音频数据 , -1:id3Track ,应该从PMT表中查找 |
transport_scrambling_control | 2bit |
是否有干扰码 |
adaptation_field_control | 2bit |
是否有扩展字段,0x01:payload only ,0x02:adaptation field only ,0x03:adaptation field follow payload |
continuity_counter | 4bit |
pack seq |
var data = [] |
reference
https://gist.github.com/manyuanrong/39f151181a193b454c3b11dac1b60e15#file-jsencrypt-js
https://g.alicdn.com/de/prismplayer/2.9.0/hls/aliplayer-hls-min.js
https://stackoverflow.com/questions/28562894/how-to-loop-an-mpeg-ts-stream
maven 相关.
只构建parent pom
cd your-project |
note:
-N,--non-recursive Do not recurse into sub-projects
构建多模块
p |
mvn install -pl a -am -amd
|
-pl, –projects
构建指定的模块,模块间用逗号分隔;适合无依赖的项目
-am, –also-make (常用)
同时构建所列模块的依赖模块,比如A依赖B,B依赖C,构建B,同时构建C
-amd, –also-make-dependents
同时构建依赖于所列模块的模块,比如A依赖B,B依赖C,构建B,同时构建A
```
reference
RD2 website.
how it works
// create worker |
how to debug
Type
chrome://inspect/#workers
in chrome location bar;You can find
https://socialclub.rockstargames.com/Home/SocketWorker
in theShared workers
Click inpect as you can debug like debug normal session;
conclusion
//https://www.right.com.cn/forum/thread-4052504-1-1.html
//https://www.jianshu.com/p/01262e314eab
//http://alisdk-api-doc.oss-cn-hangzhou.aliyuncs.com/player/5.1.6/android/index.html?com/aliyun/player/VidPlayerConfigGen.EncryptType.html
hidden the network request detail;
increase debugging difficulty;
spring aop 的一些记录
AOP
PointCut
切入点
用于匹配符合某些特征的方法.
JoinPoint
连接点
程序执行过程中的一个点,如方法的执行或异常的处理。在Spring AOP中,连接点总是表示方法执行。
advice
before
beofore
目标JoinPoint
执行之前执行
afterReturing
目标JoinPoint
正常执行返回.
afterThrowing
目标JoinPoint
执行时抛出异常
after(finnaly)
目标JoinPoint
方法执行结束
around
需要手动的调用目标JoinPoint
执行.
该通知的第一个参数是ProceedingJoinPoint
类型.
import org.aspectj.lang.annotation.Aspect; |
访问当前JoinPoint
任何通知可以定义该方法的第一个参数类型为(org.aspectj.lang.JoinPoint
)类型,除@around通知外
getArgs()
返回方法参数getThis()
返回代理对象getTarget
返回目标对象getSignature()
返回被通知的方法的描述toString()
打印被通知的方法的有用描述
传递参数给Advice
|
Advice的顺序
从高到底
@Around, @Before, @After, @AfterReturning, @AfterThrowing
java reflection.
Method.invoke
调用链
method.invoke() |
补充说明
下文中
代理类
皆为MethodAccessor
的子类当
ReflectionFactory.noInflation = true
会直接生成代理类
反射调用方法执行次数大于
ReflectionFactory.inflationThreshold(默认15)
时,会生成代理类,用于提高反射执行效率,代理类反编译后源码大致如下(以String#toCharArray
为例)
// |
当系统中反射调用过多时会导致metaspace溢出,因为生成了过多的代理类
noInflation
可通过sun.reflect.noInflation
配置inflationThreshold
可通过sun.reflect.inflationThreshold
配置
Constructor.newInstance
调用链
和上文大致类似
补充说明
- 生成代理类的代理类反编译后源码大致如下(以
new String(String)
为例)
// |
maven docker simple.
<profiles> |