事务隔离级别

脏读、不可重复读、幻读

て烟熏妆下的殇ゞ 提交于 2020-01-30 19:08:01
脏读 出现脏读需要mysql设置事务隔离级别为 read uncommited 。 有两个session,A和B,现在A开启事务,假设有一条记录为, id=1,name=zhangsasn,money=1000 现在A做更新操作,把money增加200,但是还未提交事务。 此时B开启事务,进行了查询操作,B查询的结果就会money=1200,B进行修改操作,将money减少100,提交事务。那么B查询的结果就是money=1100 之后,A并没有提交事务,而是因为某种情况回滚了事务,那么A查询的结果是money=1200。 脏读就产生了。 在数据库层面防止脏读 只需要将mysql的隔离级别设置为read commited及以上就能防止脏读的产生 不可重复读 将事务的隔离级别设置为 read commited 有两个session,A和B,现在A开启事务,假设有一条记录为, id=1,name=zhangsasn,money=1000 A查询这条记录money=1000,此时B开启事务,并进行修改这条记录的money=1200,B提交事务。 A再次查询,此时money=1200。这就出问题了,A并没有提交事务,但是第二次读到的数据跟第一次竟然不一样,就算查询语句后面加上 lock in share mode 也没用。 这就是不可重复读。 在数据库层面防止不可重复读

你在家快疯了?20 道数据库面试解析学起来

人走茶凉 提交于 2020-01-30 15:49:37
面试的时候,发现数据库方面,忘得一塌糊涂,抽时间整理了一些数据库方面的题。 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL 默认是哪个级别? MySQL 常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别? MySQL 的 MyISAM 与 InnoDB 两种存储引擎在,事务、锁级别,各自的适用场景? 查询语句不同元素(where、jion、limit、group by、having 等等)执行先后顺序? 什么是临时表,临时表什么时候删除? MySQL B+Tree 索引和 Hash 索引的区别? 聚集索引和非聚集索引区别? 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁? 非关系型数据库和关系型数据库区别,优势比较? 数据库三范式,根据某个场景设计数据表? 数据库的读写分离、主从复制,主从复制分析的 7 个问题? 使用 explain 优化 sql 和索引? MySQL 慢查询怎么解决? 什么是 内连接、外连接、交叉连接、笛卡尔积等? mysql 都有什么锁,死锁判定原理和具体场景,死锁怎么解决? varchar 和 char 的使用场景? mysql 高并发环境解决方案? 数据库崩溃时事务的恢复机制(REDO 日志和 UNDO 日志)? 事务四大特性(ACID)原子性、一致性

mysql的基本使用2019.12.23

坚强是说给别人听的谎言 提交于 2020-01-30 00:41:48
MYSQL linux安装mysql linux的mysql下载地址 下载安装 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum update yum install mysql-server 权限设置 chown mysql:mysql -R /var/lib/mysql 初始化mysql mysql --initialize 启动mysql systemctl start mysql 停止mysql systemctl stop mysql 查看mysql运行状态 systemctl status mysql 验证mysql安装 mysqladmin --version 查看mysql的所有的数据库 show databases; 连接mysql mysql -u root -p 卸载mysql 安装前检测系统是否自带mysql rpm -qa | grep mysql 普通卸载删除mysql rpm -e mysql 强力卸载删除,如果使用上面命令删除提示依赖其他文件,则使用这个命令对其强行删除 rpm -e --nodeps mysql 默认root用户密码为空,设置mysql密码

Spring Boot中的事务管理

让人想犯罪 __ 提交于 2020-01-29 12:19:49
什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。 事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态。 事务管理是Spring框架中最为常用的功能之一,我们在使用Spring Boot开发应用时,大部分情况下也都需要使用事务。 快速入门 在Spring Boot中,当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,框 架会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何额外 配置就可以用@Transactional注解进行事务的使用。 在该样例工程中(若对该数据访问方式不了解,可先阅读该文章),我们引入了spring-data-jpa,并创建了User实体以及对User的数据访 问对象UserRepository,在ApplicationTest类中实现了使用UserRepository进行数据读写的单元测试用例,如下:

Spring注解方式管理事务以及事务传播行为Propagation(视频笔记23)

大憨熊 提交于 2020-01-29 12:19:05
使用@Transactional注解声明Bean底下所有业务方法需要事务管理。 1.默认一个业务方法开启和结束事务,什么时候提交,什么时候回滚呢? Spring容器默认情况下对于运行期异常(unchecked Exception)会进行事务回滚,如果是用户违例(checked Exception),事务不会回滚。 运行期违例:throw new RuntimeException("XXX");运行期违例不需要使用try/catch捕捉,编译可以通过 用户违例,throw new Exception("XXX");必须使用try/catch捕捉,否则编译不能通过。 也可以修改这种行为,在业务方法上加上@Transactional(rollbackFor=Exception.class),则cheked Exception也会回滚。 如果@Transactional(noRollbackFor=RuntimeException.class),则运行期例外也不会回滚。 2.有些业务方法不需要业务管理,如获取数据的。开启事务会对性能有影响。所以使用 @Transactional(propagation=Propagation.NOT_SUPPORTED) propagation属性指定事务的传播行为。则Spring容器在该业务方法前不会开启事务。 事务的传播属性 : (1

何为脏读、不可重复读、幻读

痞子三分冷 提交于 2020-01-29 11:10:31
1.0、前言 事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性,隔离性是事务ACID特性中的I,根据隔离程度从低到高分为Read Uncommitted(读未提交),Read Committed(读已提交),Repeatable Read(可重复读),Serializable(串行化)四种隔离级别。在具体介绍事务隔离性前先介绍几个名词,以便说明数据库在并发操作时候可能存在的问题,以便展开来探讨这四种隔离级别对应存在哪些问题,哪些隔离级别解决了哪些问题。 1.1 何为脏读、不可重复读、幻读 脏读 所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图: image.png 如上图开启两个会话来模拟两个线程同时去访问数据库表table中id=1的记录,假设两个会话开启前数据库中table表中id=1的记录行里面的列age值为5。会话1和2一开始都开启了显示的事务(只有执行commit命令才会提交数据的修改),会话2首先更新了table中id=1的记录行的age列的值为10(更新前值为5),在会话2执行commit提交前,会话1通过select语句查询id=1的记录行中age列的值,这时候如果存在脏读,则会话1读取到的age的值是10而不是5了,虽然会话2的更新还没有提交。那么脏读存在什么问题那?如果会话2最后提交了

MySQL事务处理特性和隔离级别

喜欢而已 提交于 2020-01-29 05:33:26
一.事务的特性 1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2.一致性(Consistency):在一个事务中,事务前后数据的完整性必须保持一致,可以想象银行转账、火车购票。 3.隔离性(Isolation):多个事务,事务的隔离性是指多个用户并发访问数据库时, 一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 4.持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。 二.事务的隔离级别 上面介绍了3种事务并发问题!现在介绍一下数据库提供的解决方案! 1.read uncommitted : 读取尚未提交的数据 :这个最低级,但是效率肯定最高,但是哪一个问题都不能解决。 2.read committed:读取已经提交的数据 :可以解决脏读 。 3.repeatable read:重读读取:可以解决脏读 和 不可重复读 。 4.serializable:串行化:可以解决脏读不可重复读和虚读,效率最差,相当于锁表,开发中一般不用。 上面的“2”是oracle数据库默认设置,“3”是mysql数据库默认的设置。 总结一下 事务隔离级别的性能: read uncommitted>read

@Transactional注解

喜欢而已 提交于 2020-01-29 05:09:05
@Transactional注解 一.事物传播行为介绍: @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)   @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务   @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务   @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常   @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)   @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务. 二.事物超时设置: @Transactional(timeout=30) /

Spring 事务管理的API

别说谁变了你拦得住时间么 提交于 2020-01-28 22:12:48
Spring事务管理有3个API,均为接口。 (1)PlatformTransactionManager 平台事务管理器 常用的实现类: DataSourceTransactionManager:这个实现类是spring自带的,底层使用JDBC管理事务 HibernateTransactionManage:这个实现类由Hibernate提供,需要Hibernate的支持,底层使用Hibernate管理事务 mybatis有2种方式管理事务:使用JDBC的事务管理、使用WEB容器(JBOSS,WebLogic等)的事务管理,都是使用别人的事务管理,mybatis本身并没有提供事务管理。 (2)TransactionDefinition 事务定义 用于定义事务的相关信息,比如隔离级别、超时信息、传播行为、是否只读。 (3)TransactionStatus 事务状态 用于记录在事务管理过程中事务的状态。 3个接口的关系: 事务管理器根据事务定义设置的规则来管理事务,在事务管理过程中,将事务的各种状态记录到事务状态对象中。 来源: https://www.cnblogs.com/chy18883701161/p/12238130.html

Spring 事务管理的使用

一曲冷凌霜 提交于 2020-01-28 22:11:59
Spring提供了2种事务管理 编程式的 声明式的(重点):包括xml方式、注解方式(推荐) 基于转账的demo dao层 新建包com.chy.dao,包下新建接口AccountDao、实现类AccountDaoImpl: public interface AccountDao { //查询用户账户上的余额 public double queryMoney(int id); //减少用户账户上的余额 public void reduceMoney(int id, double amount); //增加用户账户上的余额 public void addMoney(int id, double amount); } @Repository public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { @Override public double queryMoney(int id) { String sql = "select money from account_tb where id=?"; JdbcTemplate jdbcTemplate = super.getJdbcTemplate(); double money = jdbcTemplate.queryForObject(sql,