博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务详解
阅读量:3959 次
发布时间:2019-05-24

本文共 2186 字,大约阅读时间需要 7 分钟。

事务的ACID特性以及实现原理概述

原子性  事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败

一致性  系统的状态满足数据的完整性约束,比如转账前后两个账户的金额总和应该保持不变

隔离性  并发执行的事务不会相互影响,比如多个用户同时往一个账户转账,结果应该和按先后次序转账一样

持久性  事务一旦提交,数据库的更新就是持久的,任何事务或系统故障都不会导致数据丢失

在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面

1  事务的并发执行

2  事务故障或系统故障

数据库系统是通过并发控制技术和日志恢复技术来维持一致性

并发控制保证事务的隔离性,使一致性不会因并发执行的操作被破坏

日志恢复保证事务的原子性和持久性,使一致性不会因事务或系统故障被破坏,使已提交的对数据库的修改不会因系统崩溃而丢失

常见的并发异常

脏写  事务回滚了其他事务对数据的已提交修改

脏读  一个事务读取了另一个事务未提交的数据

丢失更新  事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样

不可重复读  一个事务对同一数据的读取结果前后不一致。

脏读和不可重复读的区别  前者读取的是事务未提交的脏数据,后者读取的是事务已经提交的数据,只不过因为数据被其他事务修改过导致前后两次读取的结果不一样

幻读  事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。

幻读和不可重复读的区别  不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中

乐观锁和悲观锁

乐观并发控制  对于并发执行可能冲突的操作,假定不会真的冲突,允许并发执行,直到真正发生冲突时才去解决冲突,比如让事务回滚

悲观并发控制  对于并发执行可能冲突的操作,假定其必定发生冲突,通过让事务等待(锁)或者时间戳排序的方式使并行的操作串行执行

spring事务简介

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,它不属于的事务实际提供方数据库行为

事务隔离级别

所有事务隔离级别都不允许出现脏写

DEFAULT:默认值,表示使用底层数据库的默认隔离级别。通常就是读未提交

READ_UNCOMMITTED:一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用

COMMITTED:一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐

REPEATABLE_READ:一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读

SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别

Spring中七种事务传播行为

事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

Spring事务类型

编程式事务简介

使用TransactionTemplate

编程式事务API

DataSourceTransactionManager:

事务管理器对JDBC进行事务管理,在spring中对JDBCTemplate进行事务管理

声明式事务简介

建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

优点  不需要通过编程的方式管理事务,只需在配置文件中做相关的事务规则声明(或通过@Transactional注解的方式),将事务规则应用到业务逻辑中

声明式事务管理要优于编程式事务管理,只要加上注解就可以获得事务支持。和编程式事务相比,声明式事务缺点是,它的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

转载地址:http://hpazi.baihongyu.com/

你可能感兴趣的文章
jsp 2.0标记文件
查看>>
Hibernate中Criteria的完整用法
查看>>
sql jsp
查看>>
Word生成目录
查看>>
JSP彩色验证码源程序编写
查看>>
java操作Excel、PDF文件
查看>>
java 获得系统变量
查看>>
window.event对象用法讲解
查看>>
jive license保护原理
查看>>
java des加密
查看>>
struts&hibernate&spring例子
查看>>
inno使用教程
查看>>
网吧系统母盘制作(系统分区整体考虑优化配置篇)
查看>>
spring beans beanfactory applicationcontext
查看>>
使用ORM工具进行数据访问
查看>>
使用ORM工具进行数据访问
查看>>
Quartz 使用手记 --转
查看>>
编译与部署Eclipse+Tomcat+MySQL+Liferay4.1.2
查看>>
MySQL用户授权
查看>>
mysql忘记密码怎么办?~
查看>>