spring
A.spring事务隔离级别
说到事务隔离级别就要知道 什么是事务 事务必须服从**ACID
**原则 通俗理解,事务其实就是一系列指令 的集合 事务特征有四点
1.原子性 (atomicity) 操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执 行失败 所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态
2.一致性(consistency)事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定
3.隔离性(isolation)在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
4.持久性(durability)当事务正确完成后,它对于数据的改变是永久性的。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
为什么要进行是事务隔离
当多个认为并发访问数据库执行认为过程中 如果有一些子任务出现***异常*** 只是回滚那些出现异常的任务而不是整个任务 如何实现这一功能呢
隔离性(Isolation)作为事务特性的一个关键特性,它要求每个读写事务的对象 对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,在数据库层面都是使用锁来实现。
事务隔离级别有四种 从低到高
1.READ UNCOMMITTED(未提交读):最低隔离界别 基本什么都不解决 允许读取未被事务提交的变更数据 会出现脏读,幻读,不可重复读等问题
2.READ COMMITTED(读已提交数据):允许读取已被其他事物提交的变更数据 可避免脏读 不可避免幻读等问题
3.REPEATABLE READ(可重复读):确保事务多次读取相同的值 在事务执行时间 会禁止其他事务对字段的变更 可避免脏读和不可重复读 仍可能 出现幻读
4.SERIALIZABLE(序列化):确保事务从一个表中读取相同的数据 执行起间 禁止其他事务对改字段的操作 可避免所以并发问题 但性能低
B.事务的七种传播行为
**1传播行为**:在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务等,这便是事务的传播行为。
在Spring的事务机制中对数据库存在7种传播行为
比如说Required 它支持当前事务 如果没有当前事务 方法将在该事务中运行否则会启动一个新的事务
还有Supports 如果没有事务就以非事务运行 不需要事务的上下文
还有Mandatory 如果没有事务 就抛出异常
Not_Supported 就是非事务运行 如果存在当前事务 就在该方法运行区间 当前任务将被挂起
还有Never 以非事务方式执行 如果当前事务正在运行 则会抛出异常
还有个Requires_New 就是支持一个内嵌的一事务过程
C.Spring aop(面向切面编程)
主要实现方式有比如权限判断 日志统计的一些操作等 就是写好的业务块 想要加入一些比如日志权限等操作 将这类与业务无关的代码块动态的植入到这个业务的方法前或方法后 这就是一个面向切面编程
Aop实现的是一种动态代理 一种是JDK的Proxy 第二种就是CGLIB 他俩也是有一点区别的
JDK的proxy可以生成语言接口 就是语言实现相同接口的一个类 是通过反射来接受被代理的类 并且要求被来历的类必须实现一个接口 如果目标类没有实现接口 那么 就会使用CGLIB来是动态代理目标类
CGLIB来是动态代理 他会使用一种字节码的编译器(ASM的一个编译器) 是一个代码生成的类库 可以再运行动态的生成某个类的子类 他是以通过继承的方式做动态代理的 所以如果某个类被标记为final 那么它是无法使用CGLIB做动态代理的
性能上来说CGLIB在创建对象的过程中 可能会做的更慢一点 但是在运行时可能效率会高一点
扩展 反射
运行时获取到对象或集合泛型这么一个运行时的这个类型打到它钓鱼台的一个业务的实体类 去放置他的一些信息
反射可以获取到运行的一些状态 所以能够达到代码的复用过程 (动态获取)
反射的性能在大多数情况下并没有那么好:
他会先去方法区里面看它这个类是否被加载过 如果没有的话 会有类加载的这么一个过程
反射是一种解释操作 需要去告诉Jvm 希望他怎么做 比我们直接去写代码 直接操作会慢一点在一定程度上影响到这个性能