发表于: 2018-05-20 19:34:44

1 1249


今日完成:

一,学习了什么是"堆","栈","堆栈","队列",他们的区别.

堆:什么是堆?又该怎么理解?

1,堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用. 堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。如果在堆中没有内存可供使用做实例分配,并且堆也没有扩展的时候,就会出现OutOfMemoryError异常。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)


栈:什么是栈?又该怎么理解?

1,栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量. 
在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域). 

它是线程私有的。它的生命周期也和线程的生命周期捆绑在一起。 每个java方法在执行的时候都会创建一个栈帧用来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直至完成执行后的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。在java虚拟机栈中,局部变量表所需要的内存空间在编译期间完成分配的。如果线程请求的栈深度大于虚拟机所设的深度,将抛出 StackOverflowError异常

(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)


堆栈:什么是堆栈?又该怎么理解?

1,注意:其实堆栈本身就是栈,只是换了个抽象的名字

堆栈的特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。


队列:什么是队列?又该怎么理解?

①队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

②队列中没有元素时,称为空队列。

③建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

④队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。(先进先出)



二,学习了什么是Spring 的事务管理.

1. 事务的概念

事务必须服从ACID原则。ACID指的是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。
通俗理解,事务其实就是一系列指令的集合。
  • 1
  • 2
  • 3
  • 原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。
  • 一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。
  • 隔离性:在该事务执行的过程中,无论发生的任何数据的改变都应该只存在于该事务之中,对外界不存在任何影响。只有在事务确定正确提交之后,才会显示该事务对数据的改变。其他事务才能获取到这些改变后的数据。
  • 持久性:当事务正确完成后,它对于数据的改变是永久性的。

2. 并发事务导致的问题

在许多事务处理同一个数据时,如果没有采取有效的隔离机制,那么并发处理数据时,会带来一些的问题。
  • 1
  • 2
  • 第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。

      脏读:一个事务读取到另一个事务未提交的更新数据。

     幻读也叫虚读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。

      不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。

      

     第二类丢失更新:是不可重复读的特殊情况。如果两个事物都读取同一行,然后两个都进行写操作,并提交,第一个事物所做的改变就会丢失。


3. 事务特性

由上图,我们可以看出TransactionDefinition就是用来指定事务特性的。包含了以下内容:

3.1 事务传播行为
    事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
  • 1
  • 2
  • PROPAGATION_REQUIRED:当前方法必须在事务中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果没有,则新建一个事务。此选项为默认值。
  • PROPAGATION_SUPPORTS:如果当前存在事务环境,该方法就加入事务中执行。如果当前没有事务,就以非事务的方式执行。
  • PROPAGATION_MANDATORY:当前方法必须在事务中运行,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:当前方法总是会为自己发起一个新的事务,如果当前方法已经运行在一个事务中,则原有事务被挂起,创建一个属于自己的事务,直到自身的事务commit结束,原有的事务才会恢复执行。
  • PROPAGATION_NOT_SUPPORTED:当前方法总是以非事务方式进行操作。如果当前存在事务,就把当前事务挂起,等该方法以非事务的状态运行完成,再继续原来的事务。
  • PROPAGATION_NEVER:当前方法总是以非事务方式进行操作。如果方法在事务范围内执行,容器则抛出异常。
  • PROPAGATION_NESTED:当前方法执行时,如果已经有一个事务存在,则以嵌套事务的方式运行在当前事务中。子事务可以单独的进行回滚提交操作,不会对父事务造成影响。但是子事务要受父事务的影响。
3.2 事务隔离级别
事务隔离级别,是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:
  • 1
  • 2

- ISOLATION_DEFAULT:采用数据库默认隔离级别 
- ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 
- ISOLATION_READ_COMMITTED:大多数主流数据库的默认事务等级。保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了脏读。该级别使用与大多数系统。 
- ISOLATION_REPEATABLE_READ:保证一个事务不会修改已经由另一个事务读取但为提交(回滚)的数据,也就是对同一字段在同一事务中多次读取的结果都是一致的。避免了脏读和不可重复读的情况,但是带来了更多的性能损耗。 
- ISOLATION_SERIALIZABLE:最严格的级别,事务串行执行,资源消耗最大。

3.3 事务超时
    事务超时,指的是设置事务执行的最长时间,如果超过时间事务还没有执行完成便立即回滚该事务。在 TransactionDefinition 中以 int 的值来表示超时时间,单位为是秒。
  • 1
  • 2
3.4 事务只读属性
    事务只读,指的是操作数据库时,只进行读取操作,而不会做相应的修改。只读属性并不是强制性的选项,而是一种优化配置。它将只读配置信息传递给数据库,以期待数据库会对其做一些特定化的优化。例如,不安排相应的数据库锁,以减轻事务对数据库的压力等。
  • 1
  • 2
3.5 事务回滚规则
     默认配置下,spring只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚。可以明确的配置在抛出那些异常时回滚事务,包括checked异常。
  • 1

PS.RuntimeException + Error 和其子类都是属于 uncheck exception 
Exception类中除了 RuntimeException之外的类 都是属于 check exception
三,学习了Quartz定时框架.
       Quartz中最核心的是任务调度器Scheduler,它负责管理Job,Trigger和 Calendar,而每一个Job就是一个需要执行任务的java类,在Schelduler调度任务时 执行的就是这个类的execute()方法,另外我们还可以通过JobDataMap向Job传递数据。Trigger的作用是决定何时去执行一个Job,Trigger的类型一共有三种,分别是SimpleTrigger,它可以实现基本的定时触发功能,如以固定的时间间隔执行n次Job。第二种Trigger是CronTrigger,它使用cronExpression来设置任务执行的时间,如“0/5 * * * * ?”表示每隔5秒出发一次。第三种就是NthIcludedDayTrigger,这类触发器用于设定某一间隔类型的第几天执行任务。

明日计划:
1,完成任务八.

收获:
1,学习了Spring的事务管理与Quartz定时框架.


返回列表 返回列表
评论

    分享到