数据库事务

spring的注解事务控制测试方法

纵饮孤独 提交于 2019-12-20 16:37:03
在公司做了个项目,同事搭的架子,用的springboot框架,但是没有service层,我在想以前学习的事务相关的操作都是在service层添加注解@Transactional,这次就直接试试添加到controller层了。 但是之前没测试过事务的问题,这次就自己简单测试了一下,在这记录一下。 首先先不添加事务注解。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191220100645875.png 同时在一个方法中,自定义一个异常。该方法中有update和delete两种数据库操作方法。运行方法后,在delete方法前的update方法会执行成功,当报出异常后,后续代码不执行。![在这里插入图片描述](https://img-blog.csdnimg.cn/20191220100807593.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzg3Nzg1Ng==,size_16,color_FFFFFF,t_70 当给controller加入@Transactional注解后,运行方法,逻辑不变(在delete方法前的update方法会执行成功,当报出异常后

Spring数据访问和事务

梦想的初衷 提交于 2019-12-20 14:07:26
1、模型 2、解耦 3、实现 3.1 核心接口 3.2 代码分析 3.2.1 事务管理 3.2.2 数据访问 4、使用 4.1 编程模式 4.2 配置模式 4.2.1 声明式配置方式 4.2.2 注解式配置方式 5、总结 1、模型 在一般的编程习惯中,Spring的数据访问和事务处理的层次结构归纳如下图所示: 图. 1 2、解耦 Spring事务作为一个独立的组件,其目的就是为了与数据访问组件进行分离,这也是Spring事务框架设计的原则。根据这一职责清晰的原则,Spring在设计时就对事务和数据访问进行了很好的职责划分,这个可以从spring-tx和spring-jdbc这两个包就可以看出来。 但是在实际的代码中,会遇到一个棘手的问题:事务和数据访问操作都需要同一个数据库连接资源,那么它们之间怎么传递呢? 这里涉及三个方面:一是线程安全,二是资源的唯一性,三是事务和数据访问的解耦。 图. 2 在图2中的1、2和3这三个地方都需要使用数据库连接,并且是同一个连接。Spring的做法是将该连接放在一个统一的地方,要使用该资源,都从这个地方获取,这样就解决了事务模块和数据访问模块之间的紧耦合。 解除耦合之后,对于不同的ORM技术,则需要提供不同的事务管理实现,如下图所示: 图. 3 3、实现 3.1 核心接口 Spring事务框架的核心接口是:TransactionDefinition

Python面试刷题day01(DB面试题01-05)

余生长醉 提交于 2019-12-20 08:28:49
目录 MySQL基础 SQL语言处理代码的顺序 SQL查询处理步骤 事务 存储过程 索引 最左前缀规则 MySQL基础 1. from 子句组装来自不同数据源的数据; 2. join 子句将多张表连接起来 3. on 子句筛选连接表要显示的内容 4. where 子句基于指定的条件对记录进行筛选; 5. group by 子句将数据划分为多个分组; 6. 使用聚集函数进行计算; 7. 使用 having 子句筛选分组; 8. 计算所有的表达式 9. select 字段 10. distinct 去重 11. 使用 order by 子句对结果集进行排序 12. 使用 limit 子句限制结果集返回的记录数 SQL语言处理代码的顺序 SQL语言处理代码的顺序 在 SQL 语句中,第一个被处理的子句是 from ,而不是第一出现的 select 。 SQL查询处理步骤 SQL查询处理步骤 1. from 2. join 3. on 4. where 5. group by 6. having 7. select 8. distinct 9. order by 10. limit 以上每个步骤都会产生一个虚拟表,该虚拟表作为下一个步骤的输入, 只有最后一步生成的表才会返回给调用者。 事务 什么是事务,MySQL是如何支持事务的? 事务是一段 sql 的批处理,但这个批处理是原子性操作

mysql事务使用 超简单

做~自己de王妃 提交于 2019-12-20 08:25:33
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务、行级锁、并发 3.Berkeley DB:支持事务 进去mysql数据库: 查询数据库: 进入库 查看表: 拿user 表来试验; 开启事务 START TRANSACTION 或 BEGIN 提交事务(关闭事务) COMMIT 放弃事务(关闭事务) ROLLBACK 查看user 表数据 mysql-> select * from user; 开启事物 mysql -> begin; 修改user 表的id=5的数据: mysql-> update user set photo=6000 where=5; 现在执行成功,但是还在事物中,事物没有结束查看表数据 还是一样,打开新窗口 在事物外查询 表数据没变; 回来原窗口 继续执行事务,吧id=4的数据修改成4000; mysql-> update user set photo=4000 where id=4; 现在这些都在事物中,想把zhangsan的5000给lisi1000,这时张三4000,李四6000,所有sql执行完比提交事物; mysql-> commit; mysql-> select * from user; 事物执行成功;一个事物到这就结束了;

【转帖】分布式事务之解决方案(XA和2PC)

China☆狼群 提交于 2019-12-20 07:30:51
分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 ​ 博彦信息技术有限公司 java工程师 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知这几种。 3.1. 什么是2PC 2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两阶段,P是指准备阶段,C是提交阶段。 举例 :张三和李四好久不见,老友约起聚餐,饭店老板要求先买单,才能出票。这时张三和李四分别抱怨近况不如意,囊肿羞涩,都不愿意请客,这时只能AA。只有张三和李四都付款,老板才能出票安排就餐。但由于张三和李四都是铁公鸡,形成两尴尬的一幕 : 准备阶段 :老板要求张三付款,张三付款。老板要求李四付款,李四付款。 提交阶段 :老板出票,两人拿票纷纷落座就餐。 例子中形成两一个事务,若张三或李四其中一个拒绝付款,或钱不够,店老板都不会给出票,并且会把已收款退回。 整个事务过程由事务管理器和参与者组成,店老板就是事务管理器,张三、李四就是事务参与者,事务管理器负责决策整个分布式事务的提交和回滚,事务参与者负责自己本地事务的提交和回滚。 在计算机中部分关系数据库如Oracle

关于 SQL语句

浪子不回头ぞ 提交于 2019-12-20 06:51:19
数据库相关的SQL 查看所有数据库 show databases; 创建数据库 格式:create database 数据库名称; create database db1; 删除 格式:drop database 数据库名称; 查看数据库详情 格式:show create database 数据库名称; show create database db1; 创建数据库指定字符集 格式:create database 数据库名称 character set utf8/gbk; create database db2 character set gbk; 使用数据库 格式: use 数据库名称 use db1; 表相关SQL 创建表 create table t1(name varchar(10),age int) engine=myisam/innodb charset=gbk/utf8; 查询所有表 show tables; 查询表详情 show create table t1; 查看表字段 desc t1; 修改表名 rename table t1 to t2; 修改表引擎字符集 alter table t1 engine=myisam/innodb charset=gbk/utf8; 添加表字段 alter table t1 add age int first/after xxx

脏读

a 夏天 提交于 2019-12-20 05:00:08
测试 READ UNCOMMITTED(读取未提交)的隔离性; insert into user values ( 3 , '小明' , 1000 ) ; insert into user values ( 4 , '淘宝店' , 1000 ) ; select * from user ; + ----+-----------+-------+ | id | name | money | + ----+-----------+-------+ | 1 | a | 900 | | 2 | b | 1100 | | 3 | 小明 | 1000 | | 4 | 淘宝店 | 1000 | + ----+-----------+-------+ 开启一个事务操作数据 小明在淘宝店买了一个 100 元的零食 star transaction ; update user set money = money - 100 where name = '小明' ; update user set money = money + 100 where name = '淘宝店' ; 淘宝店查询结果 select * from user ; SELECT * FROM user ; + ----+-----------+-------+ | id | name | money | + ----+--------

面试之数据库分表

♀尐吖头ヾ 提交于 2019-12-20 04:55:38
数据库分表) 数据切分 垂直(纵向)切分 水平(横向)切分 分库分表带来的问题 1. 事务一致性问题 2. 跨节点关联查询 join 问题 3. 跨节点分页、排序、函数问题 4. 全局主键避重问题 1. UUID 2. 结合数据库维护主键ID表 3. Snowflake分布式自增ID算法 5. 数据迁移、扩容问题 什么时候考虑切分 1. 能不切分尽量不要切分 2. 数据量过大,正常运维影响业务访问 3. 随着业务发展,需要对某些字段垂直拆分 4. 数据量快速增长 5. 安全性和可用性 案例分析 1. 用户中心业务场景 2. 水平切分方法 "根据数值范围":以主键uid为划分依据,按uid的范围将数据水平切分到多个数据库上。 "根据数值取模":也是以主键uid为划分依据,按uid取模的值将数据水平切分到多个数据库上。 3. 非uid的查询方法 1. 建立非uid属性到uid的映射关系 1. 映射关系 2. 基因法 2. 前台与后台分离 支持分库分表中间件 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding)

事务四大特征:原子性,一致性,隔离性和持久性(ACID)

余生颓废 提交于 2019-12-20 04:07:34
Transaction 也就是所谓的事务了,通俗理解就是一件事情。从小,父母就教育我们,做事情要有始有终,不能半途而废。 事务也是这样,不能做一半就不做了,要么做完,要么就不做。也就是说,事务必须是一个不可分割的整体,就像我们在化学课里学到的原子,原子是构成物质的最小单位。于是,人们就归纳出事务的第一个特性:原子性(Atomicity)。我靠,一点都不神秘嘛。 特别是在数据库领域,事务是一个非常重要的概念,除了原子性以外,它还有一个极其重要的特性,那就是:一致性(Consistency)。也就是说,执行完数据库操作后,数据不会被破坏。打个比方,如果从 A 账户转账到 B 账户,不可能因为 A 账户扣了钱,而 B 账户没有加钱吧。如果出现了这类事情,您一定会非常气愤,什么 diao 银行啊! 当我们编写了一条 update 语句,提交到数据库的一刹那间,有可能别人也提交了一条 delete 语句到数据库中。也许我们都是对同一条记录进行操作,可以想象,如果不稍加控制,就会出大麻烦来。我们必须保证数据库操作之间是“隔离”的(线程之间有时也要做到隔离),彼此之间没有任何干扰。这就是:隔离性(Isolation)。要想真正的做到操作之间完全没有任何干扰是很难的,于是乎,每天上班打酱油的数据库专家们,开始动脑筋了,“我们要制定一个规范,让各个数据库厂商都支持我们的规范!”,这个规范就是

数据库中事务的特性:ACID

只谈情不闲聊 提交于 2019-12-19 18:15:53
原子性:一个事务的所有操作,要么全部执行,要么全部失败回滚 一致性:事务执行结果使数据库从一个状态转变为另一个状态 隔离性:事务操作提交之前,操作结果对其他事务不可见 持久性:事务提交之后,所有修改结果会永久保存到数据库中 来源: 51CTO 作者: zcq_linux 链接: https://blog.51cto.com/14480044/2447535