事务隔离级别

@Transactiona注解的使用

匿名 (未验证) 提交于 2019-12-03 00:30:01
https://blog.csdn.net/yalishadaa/article/details/70261973 当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时 , 可能会出现许多意外的问题 并发事务所导致的问题可以分为下面三种类型 : 对于两个事物 读取了已经被 T2 更新但还没有被提交的字段 之后 , 若 T2 回滚 ,T1 读取的内容就是临时且无效的 . 不可重复读: 对于两个事物 读取了一个字段 , 然后 T2 更新了该字段 . 之后 ,T1 再次读取同一个字段 值就不同了 . 幻读: 对于两个事物 从一个表中读取了一个字段 , 然后 T2 在该表中插入了一些新的行 . 之后 , 如果 T1 再次读取同一个表 , 就会多出几行 . 从理论上来说 事务应该彼此完全隔离 , 以避免并发事务所导致的问题 . 然而 , 那样会对性能产生极大的影响 , 因为事务必须按顺序运行 . 在实际开发中 为了提升性能 , 事务会以较低的隔离级别运行 . 事务的隔离级别可以通过隔离事务属性指定 事务的隔离级别要得到底层数据库引擎的支持 , 而不是应用程序或者框架的支持 . Oracle 支持的 2 种事务隔离级别: READ_COMMITED, SERIALIZABLE Mysql 支持 4 中事务隔离级别 . 事务的回滚通过 注解完成。 1.设置事务的隔离级别:

隔离级别之可重复读级别解读

匿名 (未验证) 提交于 2019-12-03 00:22:01
CREATE TABLE `users` ( `id` smallint ( 6 ) NOT NULL AUTO_INCREMENT, `name` varchar ( 25 ) DEFAULT NULL , `age` tinyint( 4 ) DEFAULT NULL , PRIMARY KEY ( `id` ) ) ENGINE=InnoDB AUTO_INCREMENT= 11 DEFAULT CHARSET=utf8; ALTER table `users` auto_increment= 1 ; INSERT INTO users( `name` , `age` ) VALUES ( 'lyf_16' , 16 ); INSERT INTO users( `name` , `age` ) VALUES ( 'xtf_17' , 17 ); 当前事务(currTx)SQL 当前事务(currTx)结果 其他事务(otherTx)SQL 其他事务(otherTx)结果 SELECT @@GLOBAL.TX_ISOLATION AS 'GLOBAL-tx',@@SESSION.TX_ISOLATION AS '@@SESSION-tx'; SELECT @@GLOBAL.TX_ISOLATION AS 'GLOBAL-tx',@@SESSION.TX_ISOLATION AS

Spring基于注解配置事务的属性

匿名 (未验证) 提交于 2019-12-03 00:22:01
在Spring中,事务属性描述了事务策略如何应用到方法上,事务属性包含5个方面: ① 传播行为 ② 隔离级别 ③ 回滚策略 ④ 超时时间 ⑤ 是否只读 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如,方法可能继续在现有的事务中允许,也可能开启一个新事务,并在自己的事务中运行。 事务的传播行为可以由传播属性指定,Spring定义了7种类型的传播行为。其中最常用的是 REQUIRED 和 REQUIRES_NEW 。 事务的传播属性可以在 @Transactional 注解的 propagation 属性中定义。 举个例子: /** * 使用 @Transactional 指定事务方法 */ @Service ( "bookShopService" ) public class BookShopServiceImpl implements BookShopService { /** * 1. 添加事务注解@Transactional。 * 2. 使用 propagation 指定事务的传播行为, * 即当前事务方法被另外一个事务方法调用时,如何使用事务: * 是使用调用方法的事务,还是开启一个新事务(使用自己的事务)。 * 3. propagation: * ① 默认值是 Propagation.REQUIRED, 即使用调用方法的事务。 * ② 可以指定为

spring Aop事务配置总结

匿名 (未验证) 提交于 2019-12-03 00:22:01
首先,先大概介绍下事务: 1.1什么是事务 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 1.2事务特性 一致性 :事务的执行前后数据完整性保持一致 隔离性 :一个事务执行的过程中 ,不应该受到其他事务的干扰 持久性 :事务一旦结束,数据就持久到库 不可重复读 :一个事务读到了另一个事务已经提交的 update的数据导致多次查询结果不一致。 1.4解决读问题:设置事务隔离级别 读未提交:脏读,不可重复读,幻读都有可能发生 读已提交:避免脏读,但是不可重复读和幻读有可能发生 可重复读:避免脏读、不可重复的,但是幻读有可能发生 串行化:避免以上所有读问题 2.spring事务管理--xml配置aop事务(方法一) 2.1xml配置文件--applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www

事务

匿名 (未验证) 提交于 2019-12-03 00:16:01
什么是事务 : 举例 : 张三李四 进行 转账的操作 事务的四大特性(ACID): 并发访问问题----由隔离性引起 : 1.脏读: 2.不可重复读: 3.幻觉读: 事务的隔离级别: read uncommited:读取未提交的数据:哪个问题都不能解决。 read commited:读取已提交的数据:可以解决脏读,oracle默认的级别。 repeatable read:重读读取: 可以解决脏读和不可重复读,mysql默认的级别。 serializable:串行化: 可以解决脏读、不可重复读、幻觉读,相当于锁表。 java事务 主要有两种:jdbc事务(本地事务),jta (java tranaction api)事务(分布式事务) 一、JDBC事务操作: jdbc默认的是自动事务,执行slq语句,executeUpdate() ---- 每执行一次executeUpdate方法 代表 事务自动提交。 jdbc的API手动事务: (1) 开启事务:conn.setAutoCommit(false) //关闭自动提交,开启收到提交; (2) 提交事务:coon.commit(); (3) 回滚事务:coon.rollback(); 注意:控制事务的connnection必须是同一个 执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制 /

事务面试题

匿名 (未验证) 提交于 2019-12-03 00:16:01
事务的特性ACID 事务提供了一种机制,可用来将一系列数据库更改归入一个逻辑操作。更改数据库后,所做的更改可以作为一个单元进行提交或取消。事务可确保遵循原子性、一致性、隔离性和持续性(ACID)这几种属性,以使数据能够正确地提交到数据库中。 1.脏读 一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误的数据,这样就造成了脏读 2.不可重复读 3.幻读 第一个数据正在查询某一条数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻读 不可重复读是指在同一查询事务中多次进行,由于其他提交事务所做的修改和删除,每次返回不同的结果集,此时发生不可重复读 幻读是指在同一查询事务中多次进行,由于其他提交的事务所做的插入操作,每次返回不同的结果集,此时发生幻读表面上看,区别就在于不可重复读能看见其他事务提交的修改和删除,而幻读能看见其他事务提交的插入 1.default:(默认) 默认隔离级别,使用数据库默认的事务隔离级别 2.read_uncommitted:(读未提交) 这是事务最低的隔离级别,他允许另外一个事务可以看到这个事务未提交的数据,这种隔离级别会产生脏读

mysql事务的隔离级别

南笙酒味 提交于 2019-12-03 00:14:28
mysql事务的隔离级别 查看当前数据库的隔离级别: select @@tx_isolation; 默认的隔离级别为:可重复度(REPEATABLE-READ) 设置当前会话的隔离级别: set tx_isolation='<隔离级别>' 读未提交----read-uncommitted 当多个会话同时操作同一张表,其中某一个会话M尝试去读取表中的数据时,它会直接读取到其他会话开启事务后对表的内容造成修改后的但事务尚未提交的内容。当事务发生回滚,会话M再去查询,会出现与此之前不同的数据,造成脏读。 会话A开启事务,往表中修改了数据,但事务还未结束。此时会话B想要查询这个表的数据,查到的内容是刚刚会话A修改后的内容。若会话A在会话B刚刚查询之后选择回滚了事务,会话B再去查询,会跟之前查询到的内容不一样。 读已提交----read-committed 跟上面的读未提交的相反,当前的会话只会读到其他会话结束后的表数据,无论其他会话在自己的事务中做了啥修改,只要为结束当前的会话,其他的会话都无法读取到会话未结束前的修改。 可重复读----repeatable-read 会话M开始事务去查询的同时,其他多个会话在对会话M查询的内容做修改,无论其他会话结束与否,会话M的事务只要没有结束,会话M去查询的内容始终与会话M开启事务时查询到的内容一致。当会话M的事务结束后,会话M再去查询

Mybatis事物浅谈

匿名 (未验证) 提交于 2019-12-03 00:14:01
本篇文章主要对Mybatis事物进行基础的介绍。先回顾JDBC事物,再了解Mybatis里面的事物应用。 1.JDBC的事务管理回顾 JDBC的事务管理是基于Connection对象实现的: 开启事务:connection.setAutoCommit(false) 提交事务:connection.commit() 回滚事务:connection.rollback() 2.事务的特性:ACID 原子性:事务是不可分割的。一个事务里的操作,不可能成功一半 一致性:事务提交前后,数据/状态是一致的 隔离性:事务并发时,事务应该是互不干扰相互独立的 持久性:事务一旦提交,数据就永久保存到磁盘上。 3.事务并发时可能存在的问题: ①脏读:一个事务里读取到另外一个事务未提交的数据。 ②不可重复读:一个事务里,多次读取的数据不一致。是受到了其它事务update的干扰。 ③虚读/幻读:一个事务里,多次读取的数据不一致。是受到了其它事务insert、delete干扰事务之间的隔离级别不够高,会导致事务并发问题。 使用隔离级别解决事务并发问题 隔离级别 脏读 不可重复读 虚读 read uncommitted 有 有 有 read committed 无 有 有 repeatable read 无 无 有 serializable 无 无 无 两种事物管理的方式: 手动提交 与 自动提交

什么是事务

大兔子大兔子 提交于 2019-12-03 00:12:58
一、事务的概念 事务就是一组独立不可分割的工作单元,事务中的操作要么全部执行,要么都不执行。 二、事务的四大特性(ACID) 1、原子性(Automatic) 事务中的所有的操作要么是全部成功要么是全部失败,不会存在事务中操作部分失败,部分成功的情况。 2、一致性(Consistent) 执行事务前操作的数据的状态和执行事务后所操作数据的状态是一致的,例如:我们操作数据库以一个事务操作从A用户的账户中转账200元到B用户的账户中,操作前A账户有1000元,B账户有200元,其中涉及到两个操作从A账户扣减200元,往B账户增加200元,在事务的操作成功提交后,A账户有800元,B账户有400元。事务操作前A、B账户的总额为1200元,事务操作后A、B账户的总额仍是1200元。A、B的总额在事务的操作前后都是一致的。如果在执行这个事务的操作的过程中出现错误,则事务不成功,整个事务操作都是失败的,不存在部分成功部分失败的情况,则在事务操作后的A、B账户的总额仍是1200元。 3、隔离性(Isolation) 通常来说事务的操作在最终提交前,对其他事务的来说都是不可见的。但是隔离性在不同的隔离级别下却不一定总是满足以上的描述。 4、持久性(Duration) 一个事务的操作在提交成功操作后,数据库中所做的修改就是永久性的,即使是数据库系统故障崩溃,事务的修改都不会丢失。 三

数据库设计优化

匿名 (未验证) 提交于 2019-12-03 00:11:01
数据库的基本语法的使用,很多,我也没有去整理,所以在这里就不介绍那些基本的语法了。如果对这方面有问题,我在这里给大家分享一个方法:   SQL语句应该怎样去优化?在职业生涯中,有一次维护一个项目中的一个模块。之前做的那个同事离职了,交给我来维护。我记得好像是七八张表吧,各种join、order by、distinct、group by.......看得头大。这样的SQL语句应该怎么优化呢?额......这怎么优化啊?建议从表的设计方面考虑吧。后来我也是这样做的,重新设计表,将表的数量减少,将数据更新到那写新表中去。即使不刷数据,流程中做下控制,时间久了,老表中的数据也都会更新到新表中去。 数据库设计步骤:   1、需求分析:大概明白需要存储什么   2、概要设计阶段:E-R图,表-属性-关系表,解决多方的沟通问题   3、详细设计,细致到表甚至字段 关系型数据库:面向对象的封装+关系 面向对象的思想来建表:   一对一:人----身份证;垂直分别的时候;相同主键/外键   一对多:订单----商品表;省-----市;公司-----员工;主外键表示   多对多:用户----菜单;学生----课程;女神----备胎;关系表/中间/映射表 三大范式:   第一范式:每一列保持原子性,不可分割     原子性:不可分割。     人----工作电话/家庭电话/移动电话,必须要拆分开