一、事务
原则:原子性、一致性、隔离性、持久性
事务不一定指数据库,通常说事务就是指数据库的事务。
事务是数据库连接(connection)产生,mybaits 是sqlsession,所以spring框架中事务默认在持久层(DAO),而我们的 业务由写在service层,所以会人为的把事务放到service层。
在service层就可能出现事务调用事务的情况--->spring用事务的传播方式来解决(7种)
在高并发的时候,事务可能出现脏读、幻读、不可重复读。---->线程出现问题---->锁---->数据库提供了锁机制:事务的隔离级别(mysql支持4种)
大部分代码不需要加事务,特别查询的代码不需要事务。事务本质是锁,所以会降低效率。
***7种描述:***
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。
***描述:***
脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。
***四个隔离级别:***
读取未提交(READ-UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据变更,可能造成脏读、不可重复读、幻读。
读取已提交(READ-COMMITTED):允许读取并发事务已经提交的数据,可以避免脏读,但是可能造成不可重复、幻读。
可重复读(REPEATABLE-READ):对同一字段多次读取的结果都是一致的,除非本身事务修改,可以避免脏读和不可重复读,但是可能造成幻读。
可串行化(SERIALIZABLE):最高的隔离级别,完全服从ACID的隔离级别,所以的事务依次执行,可以避免脏读、不可重复读、幻读。
分布式事务:
1、比单体项目的事务更严重的降低效率,不是必须就不用
2、分布式事务因为是不同的数据库,所以需要一个协调机制
3、分布式事务常用的方式 2PC 3PC TCC
二、日志治理ELK
索引:加快检索速度,但是会增加修改的维护成本。
索引:分为聚集索引(数据库自动维护,第一个字段不为空,往往是ID),和非聚集索引(我们创建的索引-普通索引)。
普通索引---->聚集索引---->物理行。
索引会占用物理空间(硬盘)
什么情况下索引会失效?什么情况下不应该建索引?
ES(ElasticSearch)--->索引数据,NOSQL(非关系型数据库) ---->restFull风格