事务隔离级别

要想写好“增删改查”,你必须知道的MySQL InnoDB相关知识

此生再无相见时 提交于 2020-01-03 05:34:34
要想写好“增删改查”,你必须知道的MySQL InnoDB相关知识 MySQL InnoDB 锁的类型 共享锁(SLock) 排他锁(XLock) 读的类型 一致性非锁定读(快照读) 一致性锁定读(当前读) 事务的隔离级别 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 事务的并发问题 脏读 不可重复读 丢失更新 MySQL InnoDB MySQL InnoDB是最常用的MySQL数据库引擎,作为一个后端程序员,必须对它有所了解。这篇博客的相关内容是参考《MySQL技术内幕 InnoDB存储引擎》第2版 锁的类型 共享锁(SLock) 共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。SQL语句:SELECT … LOCK IN SHARE MODE 排他锁(XLock) 允许事务删除或更新一行数据。排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的锁,包括共享锁和排他锁。获取排他锁的事务是可以对一行数据读取和修改。SQL语句:SELECT FOR UPDATE 读的类型 一致性非锁定读(快照读) 如果读取的行正在执行delete或update操作,这时读取操作不会因此去等待行上的锁释放,而是去读取一个快照数据

Spring事务

爷,独闯天下 提交于 2020-01-03 00:03:00
spring事务基本配置 参见: http://www.cnblogs.com/leiOOlei/p/3725911.html spring事务传播机制 参见: http://www.cnblogs.com/aurawing/articles/1887030.html 简单说一下new和nested的区别。 使用new的时候,外层事务的提交或回滚,与new的事务没有关系。而使用nested时,内层事务最终是提交还是回滚,需要依赖于外层事务。参见下表。 事务传播配置 外层事务(set a=1) 内层事务(set b=2) 最终结果 new 提交 提交 a=1 && b=2 new 提交 回滚 a=1 new 回滚 提交 b=2 new 回滚 回滚 什么都不变 nested 提交 提交 a=1 && b=2 nested 提交 回滚 a=1(这种情况需要增加一个配置: <property name="globalRollbackOnParticipationFailure" value="false" /> ) nested 回滚 提交 什么都不变 nested 回滚 回滚 什么都不变 spring事务隔离机制 参见: Isolation Level(事务隔离等级): Serializable:最严格的级别,事务串行执行,资源消耗最大; REPEATABLE READ

Spring笔记4

陌路散爱 提交于 2020-01-01 12:50:04
Spring中的JdbcTemplate JdbcTemplate:他是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装。 JdbcTemplate的作用:用于和数据库交互的,实现对表的CRUD操作 JdbcTemplate的入门 导入相关的坐标 <packaging>jar</packaging> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.0.3.RELEASE</version> </dependency> <dependency>

MySQL基础之事务编程学习笔记

自古美人都是妖i 提交于 2020-01-01 12:27:54
MySQL基础之事务编程学习笔记 在学习《MySQL技术内幕:SQL编程》一书,并做了笔记。本博客内容是自己学了《MySQL技术内幕:SQL编程》事务编程一章之后,根据自己的理解做的笔记,内容和书本并不一致,不过书本实验都经过自己验证,基于MySQL5.7版本。做笔记的目的是方便自己复习,同时分享出来或许对其他人或许有点帮助 1、事务概述 事务是数据库区别于文件系统的重要特性之一,提到事务肯定会想到事务的4个特性ACID,要保证业务的正常使用,必须保证ACID,ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),一个运行良好的事务系统也是要求具备这些特征 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,不能只执行一部分操作 一致性(consistency):一致性要求数据库总是从一个一致性的状态转换为另外一个一致性的状态,比如银行转账的例子,一个用户转账账号里减了200元,另外一个收账账号必须增加,一个失败数据必须全部回退状态,要保证事务一致性 隔离性(isolation):一般来说,一个事务所做的修改在提交之前对其它事务来说都是不可见的 持久性(durability):事务一旦提交

SpringBoot设置事务隔离等级

☆樱花仙子☆ 提交于 2020-01-01 09:12:38
"If you're gonna play the game, boy, ya gotta learn to play it right" Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。(在下文中会有图例) 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果Spring容器中存在多个 PlatformTransactionManager 实例,并且没有实现接口 TransactionManagementConfigurer 指定默认值,在我们在方法上使用注解 @Transactional 的时候,就必须要用value指定,如果不指定,则会抛出异常。对于系统需要提供默认事务管理的情况下,实现接口 TransactionManagementConfigurer 指定。对有的系统,为了避免不必要的问题,在业务中必须要明确指定 @Transactional 的 value 值的情况下。 不建议实现接口

mysql高级内容

你离开我真会死。 提交于 2020-01-01 07:40:27
一. 创建一个数据库 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生表引用过来,关系也是一条数据;根据范式要求应该存储学生的编号,而不是学生的姓名等其它信息 同理,科目表也是关系列,引用科目表中的数据 创建表的语句如下 create table scores( id int primary key auto_increment, stuid int, subid int, score decimal(5,2) ); 二. 外键 思考:怎么保证关系列数据的有效性呢?任何整数都可以吗? 答:必须是学生表中id列存在的数据,可以通过外键约束进行数据的有效性验证 为stuid添加外键约束 alter table scores add constraint stu_sco foreign key(stuid) references students(id); 此时插入或者修改数据时,如果stuid的值在students表中不存在则会报错 在创建表时可以直接创建约束 create table scores( id int primary key auto_increment, stuid int, subid int, score decimal(5,2), foreign key(stuid)

MySQL数据库事务详解

こ雲淡風輕ζ 提交于 2020-01-01 05:30:05
微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 ​ 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 例如:A向B转账100元,对应于如下两条sql语句: update from account set money=money+100 where name='b'; update from account set money=money-100 where name='a'; 1 2 1 2 数据库 默认事务是自动提交的,也就是发一条sql它就执行一条,如果想多条sql放在一个事务中执行,则需要使用如下语句: start transaction … … commit 1 2 3 4 1 2 3 4 数据库开启事务命令: start transaction :开启事务 rollback :回滚事务 commit :提交事务 MySQL数据库中操作事务命令 编写 测试 SQL脚本,如下: /* 创建数据库 */ create database day16

【事务】脏读、不可重复读、幻读解释

一世执手 提交于 2020-01-01 04:18:26
幻读 幻读是指当事务不是独立执行时发生的一种现象。 事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。 幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。 在数据库定义的四种隔离级别中 最高隔离级别SERIALIZABLE_READ可以保证不出现幻读的问题。 Repeatable Read (RR)    针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。 不可重复读 不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。 这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么

Mysql 数据库意向锁意义

允我心安 提交于 2020-01-01 04:16:27
锁:对 “某种范围” 的数据上 “某种锁” 1.“某种范围”:行、表 2.“某种锁” 2.1 共享锁Shared Locks(S锁) 1、兼容性:加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁 2、加锁方式:select…lock in share mode 2.2 排他锁Exclusive Locks(X锁) 1、兼容性:加了X锁的记录,不允许其他事务再加S锁或者X锁 2、加锁方式:select…for update 2.3 表锁:意向锁 Intention Locks,意向锁相互兼容 1、表明“某个事务正在某些行持有了锁、或该事务准备去持有锁” 2、意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存,。 3、例子:事务A修改user表的记录r,会给记录r上一把行级的排他锁(X),同时会给user表上一把意向排他锁(IX),这时事务B要给user表上一个表级的排他锁就会被阻塞。意向锁通过这种方式实现了行锁和表锁共存且满足事务隔离性的要求。 4、1)意向共享锁(IS锁):事务在请求S锁前,要先获得IS锁 2)意向排他锁(IX锁):事务在请求X锁前,要先获得IX锁 q1:为什么意向锁是表级锁呢? 当我们需要加一个排他锁时,需要根据意向锁去判断表中有没有数据行被锁定(行锁); (1)如果意向锁是行锁,则需要遍历每一行数据去确认; (2

Spring(四)

两盒软妹~` 提交于 2020-01-01 00:49:41
Spring 中的 JdbcTemplate JdbcTemplate 概述 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多 的操作模板类。 操作关系型数据的: JdbcTemplate HibernateTemplate 操作 nosql 数据库的: RedisTemplate 操作消息队列的: JmsTemplate 我们今天的主角在 spring-jdbc-5.0.2.RELEASE.jar 中,我们在导包的时候,除了要导入这个 jar 包 外, 还需要导入一个 spring-tx-5.0.2.RELEASE.jar(它是和事务相关的)。 JdbcTemplate 对象的创建 我们可以参考它的源码,来一探究竟: public JdbcTemplate() { } public JdbcTemplate(DataSource dataSource) { setDataSource(dataSource); afterPropertiesSet(); } public JdbcTemplate(DataSource dataSource, boolean lazyInit) { setDataSource(dataSource); setLazyInit(lazyInit);