事务隔离级别

理解事务的4种隔离级别

梦想的初衷 提交于 2019-12-03 13:16:45
事务 事务是访问数据库的一个操作序列 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。 事务的正确执行使得数据库从一种状态转换为另一种状态 。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是: 1、原子性 即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作则会被回滚,即数据库回到事务执行前的状态,不会发生状态转换。 2、一致性 事务的执行使得数据库从一种正确状态转换成另外一种正确状态。 3、隔离性。 在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务。 4、持久性 事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存。 事务保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。 事务并发操作带来的问题 1) 丢失更新 : 一个事务的更新覆盖了另一个事务的更新。 2) 脏读 : 一个事务读取了另一个事务未提交的数据。 3

事务

自作多情 提交于 2019-12-03 13:16:17
4.2 Spring中对事务的整合 在Spring中,所有操作事务的类都继承自 PlatformTransactionManager 4.2.1 事务的隔离级别 ISOLATION_READ_UNCOMMITTED:读未提交 ISOLATION_READ_COMMITTED:读已提交 ISOLATION_REPEATABLE_READ:可重复读 ISOLATION_SERIALIZABLE:串行化 4.2.2 脏读、不可重复读、幻读 脏读:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。例如常见的取款事务和转账事务: 不可重复读:不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。 幻读:A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。 4.2.3 事务的七种传播行为 什么是事务的传播行为:事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。 案例 Dao层接口 //加钱的方法 void addMoney(double money);

Springboot全局事务处理

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 13:13:01
什么是全局事务 Spring Boot(Spring)事务是通过aop(aop相关术语:通知(Advice)、连接点(Joinpoint)、切入点(Pointcut)、切面(Aspect)、目标(Target)、代理(Proxy)、织入(Weaving))切面编程来实现的,此时我们就可以对指定的包的service的方法进行事务控制. 为什么要使用全局事务 在实际开发中,有些同学命名方法时不规范,多个成员开发时,会造成混乱,维护成本特别高,代码可读性不高. 怎么配置Spring Boot全局事务 Spring Boot使用事务是非常简单的,只需要在配置类或者启动类上添加注解@EnableTransactionManagement开启事务支持,然后在service层添加注解 @Transactional(rollbackFor = Exception.class)即可. 下面是全局事务代码实现 特别提醒:mysql对应的表必须是InnoDB型才可支持事务,myisam不支持事务 package com.test.sketelon.util.config; ​ import org.aspectj.lang.annotation.Aspect; import org.springframework.aop.Advisor; import org.springframework.aop

mysql杂说——mysql锁

a 夏天 提交于 2019-12-03 13:11:23
Mysql用到了很多这种锁机制,行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。 1、mysql存储引擎分为:innodb 和 myisam 事务, 表锁 行锁 innodb 支持 支持 支持    myisam 不支持    支持    不支持 2、数据库锁:行锁的是索引 加锁的目的:减少资源的竞争 表级锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁: 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 3、 mysql5.7解决了幻读:解决思路通过间隙锁 防止幻读,以满足相关隔离级别的要求 间隙锁:1,3,5 存在(-∞,1),(1,3),(3,5),(5,∞) 四个间隙,分别存在4个间隙锁 4、InnoDB实现了以下两种类型的行锁。 共享锁(s):又称读锁。 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这 保证了其他事务可以读A , 但在T释放A上的S锁之前不能对A做任何修改 。 排他锁(X):又称写锁。

事务的传播行为和隔离级别

喜你入骨 提交于 2019-12-03 13:05:16
事务使用步骤如下: 步骤一、在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持 <!-- 事务管理器配置, Hibernate单数据源事务 --> <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3

SpringBoot 事务的控制

时光总嘲笑我的痴心妄想 提交于 2019-12-03 11:53:25
所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务、提交事务来完成数据操作,或者在发生错误的时候回滚数据。而Spring的事务机制是用统一的机制来处理不同数据访问技术的事务处理。Spring的事务机制提供了一个PlatformTransactionManager接口,不同的数据访问技术的事务使用不同的接口实现。SpringBoot提供了非常方便的事务操作,通过注解就可以实现事务的回滚,非常方便快捷,下面我们就说一下如何进行事务操作。 编程式事务 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。 数据访问技术 实现 JDBC DataSourceTransactionManager JPA JpaTransactionManager Hibernate HibernateTransactionManager JDO JdoTransactionManager 分布式事务 JtaTransactionManager 然后呢在代码中可以这样使用 @Resource private DataSourceTransactionManager transactionManager; public void

Spring-事务

倾然丶 夕夏残阳落幕 提交于 2019-12-03 11:29:23
Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的。Spring 的事务属性分别为传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。 在 Java EE 开发经常采用的分层模式中,Spring 的事务处理位于业务逻辑层,它提供了针对事务的解决方案。 在 Spring 解压包的 libs 目录中,包含一个名称为 spring-tx-3.2.13.RELEASE.jar 的文件,该文件是 Spring 提供的用于事务管理的 JAR 包,其中包括事务管理的三个核心接口:PlatformTransactionManager、TransactionDefinition 和 TransactionStatus。 将该 JAR 包的后缀名 jar 改成 zip 的形式后,解压压缩包,进入解压文件夹中的 \org\springframework\transaction 目录后,该目录中的文件如图 1 所示。 图 1 事务管理核心接口 在图 1 中,方框所标注的三个文件就是本节将要讲解的核心接口。这三个核心接口的作用及其提供的方法如下。 1. PlatformTransactionManager PlatformTransactionManager 接口是 Spring 提供的平台事务管理器,用于管理事务。该接口中提供了三个事务操作方法,具体如下。

事务的传播行为,隔离级别以及锁机制

混江龙づ霸主 提交于 2019-12-03 11:21:38
脏读,不可重复读和幻读。 脏读:读到未提交(uncommited)的数据 不可重复读:多次查询中(提交插入数据的事务) 幻读:在修改事务后(提交了一个添加的事务),之后查询数据以为出现幻觉    事务的隔离级别: read_uncommitted 最低的隔离级别 有脏读,不可重复读和幻读。 read_committed  看到已提交的数据 存在不可重复读和幻像读。 支持sqlsever repeatable_read 存在幻读 。支持mysql serializable    防止脏读,不可重复读外,还避免了幻像读。 MySQL默认的方式的:可重复读。    七种传播行为:  在我们用SSH开发项目的时候,我们一般都是将事务设置在Service层,那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。   如果你在你的Service层的这个方法中,除了调用了Dao层的方法之外,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的

Spring事务终极版...

回眸只為那壹抹淺笑 提交于 2019-12-03 11:19:35
1.什么是事务   事务(TRANSACTION) 是作为单个逻辑工作单元执行的一系列操作。   多个操作作为一个整体向系统提交,要么都执行,要么都不执行   事务是一个无可再分的逻辑单元 2.事务的特性   四个属性,简称 ACDI属性   原子性( Atomicity )     事务是一个完整的操作,事务的各个操作都是不可再分的,要么都执行,要么都不执行   一致性( Consistency )     当事务完成后,数据必须处于一致性   隔离性( Isolation )     并发事务之间相互隔离,独立,他不应以任何形式依赖于或影响其他事务    持久性( Durability )     事务完成后,他对数据的修改是永久性的; 3.隔离问题    脏读     一个事务读到另一个事务没有提交的数据    不可重复读     一个事务读到另一个事务已经提交的数据(正常现象,主要发生在update)    幻读(虚读)     一个事务读到另一个事务已经提交的数据(正常现象,主要发生在insert) 4.隔离级别    read uncommitted:     读未提交。存在3个问题(脏读,可重复读,虚读)    read committed:     读已提交。解决脏读,存在2个问题(可重复读,虚读)    repeatable read:     可重复读。解决

Spring事务的理解

荒凉一梦 提交于 2019-12-03 11:18:23
事务的基本原理: Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 数据库隔离级别 隔离级别 隔离级别的值 导致的问题 Read-Uncommitted 0 导致脏读 Read-Committed 1 避免脏读,允许不可重复读和幻读 Repeatable-Read 2 避免脏读,不可重复读,允许幻读 Serializable 3 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重 脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。 不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。 幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据