Spring -- 5.0

  五一过后,一直是懒散的状态,好久没有写东西了。

  spring3.x企业应用开发实战 看完了第十章,写点spring中数据库吧。

  数据库之前在大学里也学过,但是当时尼玛说句实话,都不知道干什么的,很多很重要的知识在当时感觉好无聊。就像你在大西北给你一个救生圈玩,好玩吗?
现在我再看这些知识,感觉好像在一艘船上,我知道这些东西很重要,是干什么用的了,关键时刻是可以救命的。也许再过两年,我的感觉是在水里。

  先说说数据库事务:
     
大家都知道,数据库事物必须满足4个特性:原子性、一致性、隔离性和持久性

  这几个字感觉不好理解。首先我们要知道这个东西说的是数据库的事物,主语是数据库事务。
   
 原子性这个应该还算好理解:就是说数据库事务是最小的操作单元,在一个数据库事务中的所有数据库操作(增、删、改)必须同时成功,如果有一个失败了,这个数据库事务就会回滚,让数据库返回到初始状态。
 
   一致性这个怎么理解?事务操作完成后,数据库所处的状态和它的业务规则是相符的。
   
 隔离性这个说的是多个数据库事务同时操作的情况。在并发数据操作的时候,不同的事务拥有各自的数据空间,它们各自的操作不会给对方带来影响。当然并不是完全无影响,这又牵涉到事务的隔离级别这个概念了(后面会看到)。
 
 
 持久性指一旦事务提交以后,事务中的所有数据操作都必须被持久化到数据库中。如果事务提交后,数据库马上崩溃,在数据重启的时候也必须有某种机制保障恢复数据(数据库管理系统中的日志很详细的记录了数据库的操作记录,数据库根据日志执行数据库操作或者撤销,这就是所谓的某种机制)

我们头脑中要有一个概念,就是数据很重要,数据的正确性很重要,数据库管理系统必须保证数据的安全,保障数据的正确性(一定程度上)。对数据库事务的这四个要求就是出于这个目的。我们把数据库事务定义为对数据库操作的最小单位,把数据库的具体操作(增、删、改)放在某个事物中,保证数据库事务成功完成或者回滚,如果数据库事务成功提交,那么这个数据的状态(操作后的状态)必须符合我们对业务规则的定义!在多个数据库事务并发操作的时候,必须保证数据库事务不受其他数据库事务的影响,不然,很有可能数据库操作后,数据库的状态和我们定义的业务规则相悖,所以这里引入了数据库事务的隔离级别的概念。这个持久性说的是数据库事务提交必须真正反应到数据库中,不管发生什么情况!这样我们才能保证数据库在操作后符合我们的业务规则,也就是一致性,也可以说是数据的完整和正确性。

   
如果数据库的事务没有隔离性,这句话有点抽象,翻译一下就是如果一个数据事务受到另外一个数据库事务的影响。怎么影响?如果俩数据库事务操作不同的数据,那么好像他们也不会影响到对方吧?我个人理解这里的影响指的就是数据库事务操作的数据有相同的部分。如果俩数据库事务可以随意的访问数据、修改数据(数据有可能是相同的),那么就有可能出现所谓的脏读、不可重复读、幻象读和更新丢失的现象!具体这四种情况我就不做解释了,自行百度补脑。

  为了避免这种情况的发生,就引入了数据库锁的概念。

  如果多个事务都要对同一条数据进行操作,数据库管理系统采用数据库锁机制保证事务的隔离性(使事务不受其他事务的影响),这个和Java程序采用对象锁机制进行线程同步类似。当多个事务试图同时对相同的数据进行操作,只有持有锁的事务才能进行操作,知道事务操作完成释放锁,后面的事务才有机会对数据进行操作。

我们说说数据库锁机制,数据库通过数据库锁的机制解决并发访问的问题,数据库事务隔离性的问题。

书上写的还算可以,不过开始的时候没有看懂。数据库锁按照锁定的对象不同可以分为表锁定行锁定,这个就没有解释的了。
 
 
从并发事务锁定的关系上看,又分为共享锁和独占锁。书上又写了,共享锁防止独占锁、但允许其他共享锁,独占锁既防止其他共享锁又防止其他独占锁。尼玛抽象了吧?看不懂了吧?翻译一下就是读和写。如果是读操作那应该是一个共享锁,因为大家都读,不会出现任何的问题,这就是所谓的允许其他共享锁防止其他独占锁!如果是(增、删、改)写操作,就是一个独占锁,它在锁定的时候,必须等到释放,其他数据库事务才能获得独占锁,否则数据库的数据肯定有问题啦。清楚了吧,哈哈。

SELECT FOR UPDATE语句隐式获得行共享锁,在Oracle中用户还可以通过LOCK TABLE IN ROW
SHARE MODE语句显式获得行共享锁。通过INSERT,DELETE,UPDATE语句隐式获得行独占锁,用户还可以通过lock table in row
exclusive mode语句显式获得(exclusive是专用、排外的意思)。lock table in share mode 获得表共享锁,lock
table in share row exclusive mode 获得表共享行独占锁,lock table in exclusive mode
获得表独占锁。

数据库事务的隔离级别

下面的这张图片,从数据库锁引入隔离级别的概念,并说明了为什么要引入这个概念:

ANSI/ISO SQL92标准定义了4个等级的事务隔离:READ UNCOMMITED,READ
COMMITED,REPEATABLE READ,SERIALIZABLE。SQL92推荐使用REPEATABLE
READ保证数据的一致性。

Spring -- 5.0,布布扣,bubuko.com

时间: 2024-08-08 13:59:23

Spring -- 5.0的相关文章

详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)

使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO 类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

8 -- 深入使用Spring -- 2...5 Spring 3.0 新增的注解

8.2.5 Spring 3.0 新增的注解 @DependsOn @Lazy @DependsOn :用于强制初始化其他Bean.修饰Bean类或方法,可以指定一个字符串数组作为参数,每个数组元素对应一个强制初始化的Bean. package edu.pri.lime._8_2_5.bean; import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Compon

Spring 4.0 StandaloneMockMvcBuilder java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig 问题解决

standaloneSetup(clrr). build(); 执行第二行 build() 时,出现下面的错误提示. java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig at org.springframework.test.web.servlet.setup.StandaloneMockMvcBuilder.initWebAppContext(StandaloneMockMvcBuilder.java:329) a

Spring -- 4.0

一些Spring AOP的基础 AOP的应用场合是受限的,一般只适用于那些具有横切逻辑的场合:如性能监测.访问控制.事物管理和日志记录. 我很认可书中的这么一个观点(横向和纵向的观点),这个观点也很好的帮助我们理解什么是AOP的思想:按照软件重构的思想,如果多个类中出现相同的代码,我们应该考虑定义一个它们共同使用的父类,将这些公用的代码提取到父类中,通过继承减少重复的代码.但是像事务管理.日志记录我们无法通过抽象父类的方式消除重复性的横切代码,这些横切逻辑的代码存在业务方法中,我们不能把它抽象到

Spring 3.0 AOP (一)AOP 术语

关于AOP.之前我已写过一个系列的随笔: <自己实现简单的AOP>,它的关注点在于实现.实现语言是C#,实现方式为 自定义实现 RealProxy 抽象类.重写Invoke方法,以便进行方法调用的拦截.借此实现AOP.感兴趣的园友可以去瞅瞅. 今天.我们来看一下Spring中的AOP,本随笔着重关注AOP术语. 先说一句废话:如果你对AOP不是很熟悉.第一次看到这些术语可能会有点迷惑,不过没有关系.坚持继续向下看,然后再反过来看一遍,有些东西就能恍然大悟了. 连接点(Joinpoint) 连接

Spring 2.0 的AOP介绍及其通知类型

Spring 2.0的AOP 在Spring 2.0中最激动人心的增强之一是关于Spring AOP,它变得更加便于使用而且更加强大,主要是通过复杂而成熟的AspectJ语言的支持功能来实现,而同时保留纯的基于代理的Java运行时.Spring 2.0的AOP提供给我们一种新的思考程序结构的方法,能够解决很多纯OOP无法解决的问题--让我们能够在一个模块中实现某些需求,而不是以发散的方式实现.Spring 2.0允许用户选择使用基于模式或@AspectJ注解的方式来自定义切面.这两种风格都支持所

Diagram of Spring 3.0 module dependencies--转载

原文地址:http://www.ogrigas.eu/spring/2009/12/diagram-of-spring-3-0-module-dependencies As Spring 3.0.0.RELEASE is finally out, I decided to draw a diagram that shows interdependency of modules comprising the latest Spring Framework. For the sake of simp

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及MyBatis的一些简单介绍. 本文不会对MyBatis作详细说明,大象还是假定阅读本文的朋友对MyBatis(ibatis)有最基本的了解,只有这样才能较好的理解本文的内容.关于MyBatis请查看它的官方文档及其它参考资料,本文不作详细讨论. 一.工程结构图      上面这是典型的Maven项目