事务隔离级别

事务

做~自己de王妃 提交于 2019-12-04 15:34:08
声明式事务的五大属性 1.传播机制(propagation) 指的是一个带有事务的方法A运行在另一个带有事务的方法B内部时,内层方法A是使用自己的事务还 是使用外层B的事务 required:默认值,表示如果外层方法B有事务,就使用外层方法B的事务,没有就使用自己的事务 requires_new:无论外层方法B有没有事务,内层方法A都使用自己的事务 supports:表示如果外层方法B有事务,就使用外层方法B的事务,如果外层方法B没有事务,就不使用事务 2.隔离级别(isolation):是针对数据库的并发访问的,不同的隔离级别,数据库有着不同的解决方法。 repeatable_read: 默认是 可重复度 read_uncommitted:读未提交 read_committed:读已提交 serializable:串行化读:就是如果设置了这个注解,运行期间就不允许改变值 也就是不允许并发操作。 3.回滚机制 通常只有运行时异常会自动回滚,编译时异常不会回滚,想要让其回滚只有设置rollbackFor rollbackFor ={一个异常类的字节码} 就是在事务后面的参数列表里面加上 一个异常类的字节码,当你下面遇到这样的异常时 会回滚 no rollbackFor 就是即使是运行时异常,后面如果不想让其回滚,就在事务后加上norollbackFor={运行时异常的类字节码}

Mysql事务

旧城冷巷雨未停 提交于 2019-12-04 15:22:31
一、事务的ACID属性 1.原子性 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生 2.一致性 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 一致性是指数据处于一种语义上的有意义且正确的状态。一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的。因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的。 举个粒子,张三给李四转账100元。事务要做的是从张三账户上减掉100元,李四账户上加上100元。一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态,而对于张三少了100元,李四还没加上100元这个中间状态是不可见的。 原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见 隔离性是多个事物的时候, 相互不能干扰,一致性是要保证操作前和操作后数据或者数据结构的一致性,而我提到的事务的一致性是关注数据的中间状态,也就是一致性需要监视中间状态的数据,如果有变化,即刻回滚 (如果数据库中有没有执行完的事务,那就是不一致的,否则,就是一致的) 3.隔离性 事务的隔离性是指一个事务的执行不能被其他事务干扰

spring的事务管理

こ雲淡風輕ζ 提交于 2019-12-04 13:39:30
目录 spring事务管理 xml实现 注解实现 spring事务管理 spring的事务管理是把事务由DAO层提升到service层来管理;它实际上是对于AOP思想的应用。我们只需要配置好平台事务管理器这一个“切面”就可以了; spring中“平台事务管理接口”负责完成事务的提交和回滚;接口图解如下: 对于 JDBC和Mybatis可以对“DataSourceTransactionManager” 这个事务管理接口的实现类进行配置; 如下是配置JDBC事务管理 xml实现 <!--注册平台事务管理器:切面/顾问--> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--引用自己配置的数据库--> <property name="dataSource" ref="myDataSource"/> </bean> <!--注册事务通知--> <tx:advice id="txAdvice" transaction-manager="txManager"> <!--指定连接点--> <tx:attributes> <!--可以设置事务隔离级别,和传播行为--> <tx:method name="open*" isolation="DEFAULT

mysql的锁机制详解

时光总嘲笑我的痴心妄想 提交于 2019-12-04 12:32:25
这段时间一直在学习 mysql 数据库。项目组一直用的是 oracle ,所以对 mysql 的了解也不深。本文主要是对 mysql 锁的总结。 Mysql 的锁主要分为 3 大类: 表级锁:存储引擎为 Myisam 。锁住整个表,特点是开销小,加锁快,锁定力度大,发生锁冲突的概率最高,并发度最低。 页级锁:存储引擎为 BDB 。锁住某一页的数据( 16kb 左右),特点:开销和枷锁时间介于表级和行级之间;会出现死锁,锁定力度介于表锁和行锁之间,并发度一般。 行级锁:存储引擎为 innodb 。锁住某一行的数据,特点:锁的实现更加复杂,开销大,加锁速度慢。 根据以上特点,仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如 Web 应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理( OLTP )系统。 接下来进行行级锁的详解,行级锁主要分为以下 7 类:共享 / 排他锁、意向锁、记录锁、间隙锁、临建锁、插入意向锁、自增锁。 共享 / 排他锁: 共享锁:又称读锁,可以允许读,但不能写。共享锁可以与共享锁一起使用。 语句: select ... lock in share mode 排他锁:又称写锁,不能允许读,也不能允许写,排他锁不能与其他所一起使用。 语句: select ... for

Read Uncommitted

痞子三分冷 提交于 2019-12-04 11:35:52
Read Uncommitted是隔离级别最低的一种事务级别。在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。 我们来看一个例子。 首先,我们准备好 students 表的数据,该表仅一行记录: 直线电机怎么选择 mysql> select * from students; +----+-------+ | id | name | +----+-------+ | 1 | Alice | +----+-------+ 1 row in set (0.00 sec) 然后,分别开启两个MySQL客户端连接,按顺序依次执行事务A和事务B: 时刻 事务A 事务B 1 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 2 BEGIN; BEGIN; 3 UPDATE students SET name = 'Bob' WHERE id = 1; 4 SELECT * FROM students WHERE id = 1; 5 ROLLBACK; 6 SELECT * FROM students WHERE id = 1; 7 COMMIT

MySQL的索引与事务、存储引擎

和自甴很熟 提交于 2019-12-04 10:29:00
一、索引 概念 : 在一本书中,无须阅读整本书,利用目录就可以快速查找所需信息; 书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引 : 在数据库中,索引数据库程序无须对整个表进行扫描,就可以在其中找到所需数据; 数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的作用 : 1、设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率; 2、特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍; 3、可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本; 4、通过创建唯一性索引保证数据表数据的唯一性; 5、可以加快表与表之间的连接; 6、在使用分组和排序时,可大大减少分组和排序时间。 索引的分类 普通索引:这是最基本的索引类型,而且它没有唯一性之类的限制 唯一性索引:这种索引和前面的"普通索引"基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一 主键索引:主键是一种唯一性索引,但它必须制定为"PRIMARY KEY" 全文索引:全文索引的类型是FULLTEXT,可以在VARCHAR或者TEXT类型的列上创建 单列索引与多列索引:索引可以是单列上创建的索引,也可以是在多列上创建的索引 创建索引的原则依据 表的主键,外键必须有索引; 数据量超过300行的表应该有索引;

spring事务的隔离级别和传播方式

大憨熊 提交于 2019-12-04 09:45:39
传播行为 事务传播行为类型 说明 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 PROPAGATION_REQUIRES_NEW 启动一个新的, 不依赖于环境的 "内部" 事务. 这个事务将被完全 commited 或 rolled back 而不依赖于外部事务, 它拥有自己的隔离范围, 自己的锁, 等等. 当内部事务开始执行时, 外部事务将被挂起, 内务事务结束时, 外部事务将继续执行. 另一方面, PROPAGATION_NESTED 开始一个 "嵌套的" 事务

spring Transactional(转)

断了今生、忘了曾经 提交于 2019-12-04 07:25:59
经常用到老搞混,从网上摘了点记录下来。 // 业务方法需要在一个事物中运行,如果方法运行时,已经存在一个事物中, // 那么加入该事物,否则为自己创建一个新事物。 @Transactional(propagation = Propagation.REQUIRED) public void test1() { } // 声明方法不需要事务,如果方法没有关联到一个事务,容器不会为它开启事物。 // 如果方法在一个事物中被调用,该事物会被挂起,在方法调用结束后,原先的 // 事物便会恢复执行。 @Transactional(propagation = Propagation.NOT_SUPPORTED) public void test2() { } // 表明不管是否存在事物,业务方法总会为自己发起一个新事物。 // 如果方法已经运行在一个事物中,则原有事物会被挂起, // 新的事物会被创建,直到方法执行结束,新事物才算结束, // 原先的事务才会被恢复执行。 @Transactional(propagation = Propagation.REQUIRES_NEW) public void test3() { } // 该属性指定业务方法只能在一个已经存在的事物中执行, // 业务方法不能发起自己的事物,如果业务方法在没有事物的环境 // 下调用,容器就会抛出异常。

Spring @Transactional 事务陷阱

末鹿安然 提交于 2019-12-04 07:25:19
Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked 如果遇到checked意外就不回滚。 如何改变默认规则: 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED) 在整个方法运行前就不会开启事务 还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),这样就做成一个只读事务,可以提高效率。 各种属性的意义: REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。 NOT_SUPPORTED:声明方法不需要事务

脏读、幻读和不可重复读 + 事务隔离级别

拥有回忆 提交于 2019-12-04 07:15:45
1. 脏读 : 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据 。 e.g. 1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务) 2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地! 3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000 像这样,Mary记取的工资数8000是一个脏数据。 2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样 在一个事务内两次读到的数据是不一样的,因此称为是不可重复读 。 e.g. 1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000 解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。 3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时