spring cloud/boot 使用事务以及多数据源
2017-07-17 16:21
1156 查看
一、事务四大特征
考试面试要用
,原子、一致、隔离和持久
1.原子
try{
doA()
doB()
doC()
...
}catch(AnyException){
unDoA(),unDoB(),unDoC()
}
2.一致
一致就涉及到事务了,定义为事务结束后,所有的人拿到的数据、索引都应该是一致的。
个人理解:就是原子操作完之后,[b]所有的人拿到的数据、索引都应该是一致的。[/b]
[b]3.隔离[/b]
保证不同的事务相互独立、透明地执行。
级联废弃:如果事务T1读到了事务T2未提交的数据,如果T2提
交失败,那么T1也要回滚。
隔离级别:
Read Uncommitted(读未提交)
Read Committed(读已提交)
Repeatable Read(可重复读)(MySQL默认隔离级别)
Serializable(串行化)
脏读、不可重复读、幻读
脏读:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据。
不可重复读: 一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致。
幻读: 一事务对数据进行了新增操作,另一事务两次查询的数据不一致。
脏读:主要是针对列内容的变化。
幻读:主要是针对行数的变化
二、分布式事务(流行的解决方案)
指会涉及到操作多个数据库的事务
1. 涉及多个系统,多个数据源,多个Connection的数据库操作。
2.怎么保证一致性?
两阶段提交、三阶段提交、事件模型
具体方案的实现待补充
三、Spring事务管理 @Transacational
1、Isolation(隔离性):
DEFAULT: 使用数据库设置
READ_UNCOMMITTED: 会出现脏读、不可重复读、幻读
READ_COMMITTED: 会出现不可重复读、幻读问题
REPEATABLE_READ: 会出幻读
SERIALIZABLE: 保证所有的情况不会发生
2、propagation (传播性):
requeired
supports
requried_new
not supported
mandatory
never
nested
3、代码分析
public class TxTest{
@Transacational
public void foo(){
bar();
}
@Transacational(propagation=”required_new”)
public void bar(){
}
}
调用foo()方法只会创建当前方法的事务,方法里面bar()即使定义required_new也不会创建新的事务。
public class TxTest{
@Autowird
private TxTest2 txTest2;
@Transacational
public void foo(){
txTest2.bar();
}
}
public class TxTest2{
@Transacational(propagation=”required_new”)
public void bar(){
}
}
调用foo()方法会创建当前方法的事务,运行到txTest2.bar()时会创建一个新的事务。
考试面试要用
,原子、一致、隔离和持久
1.原子
try{
doA()
doB()
doC()
...
}catch(AnyException){
unDoA(),unDoB(),unDoC()
}
2.一致
一致就涉及到事务了,定义为事务结束后,所有的人拿到的数据、索引都应该是一致的。
个人理解:就是原子操作完之后,[b]所有的人拿到的数据、索引都应该是一致的。[/b]
[b]3.隔离[/b]
保证不同的事务相互独立、透明地执行。
级联废弃:如果事务T1读到了事务T2未提交的数据,如果T2提
交失败,那么T1也要回滚。
隔离级别:
Read Uncommitted(读未提交)
Read Committed(读已提交)
Repeatable Read(可重复读)(MySQL默认隔离级别)
Serializable(串行化)
脏读、不可重复读、幻读
脏读:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据。
不可重复读: 一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致。
幻读: 一事务对数据进行了新增操作,另一事务两次查询的数据不一致。
脏读:主要是针对列内容的变化。
幻读:主要是针对行数的变化
二、分布式事务(流行的解决方案)
指会涉及到操作多个数据库的事务
1. 涉及多个系统,多个数据源,多个Connection的数据库操作。
2.怎么保证一致性?
两阶段提交、三阶段提交、事件模型
具体方案的实现待补充
三、Spring事务管理 @Transacational
1、Isolation(隔离性):
DEFAULT: 使用数据库设置
READ_UNCOMMITTED: 会出现脏读、不可重复读、幻读
READ_COMMITTED: 会出现不可重复读、幻读问题
REPEATABLE_READ: 会出幻读
SERIALIZABLE: 保证所有的情况不会发生
2、propagation (传播性):
requeired
supports
requried_new
not supported
mandatory
never
nested
3、代码分析
public class TxTest{
@Transacational
public void foo(){
bar();
}
@Transacational(propagation=”required_new”)
public void bar(){
}
}
调用foo()方法只会创建当前方法的事务,方法里面bar()即使定义required_new也不会创建新的事务。
public class TxTest{
@Autowird
private TxTest2 txTest2;
@Transacational
public void foo(){
txTest2.bar();
}
}
public class TxTest2{
@Transacational(propagation=”required_new”)
public void bar(){
}
}
调用foo()方法会创建当前方法的事务,运行到txTest2.bar()时会创建一个新的事务。
相关文章推荐
- redis中的基本数据类型,以及在Spring-Boot对Redis的基本使用
- Spring整合hibernate的事务属性介绍以及声明式事务管理 (使用Annotation和xml)
- spring cloud教程之使用spring boot创建一个应用
- Spring中事务管理支持哪几种方式以及每种方式的具体使用方法
- 【Spring Boot】使用Spring Boot来搭建Java web项目以及开发过程
- Spring-boot Mybatis多数据源事务配置
- Spring事务传播特性实例解析(以及如何使用注解形式事务)
- eclipse 使用maven 搭建 springboot+mybatis + 多数据源
- Spring Boot多数据源及其事务管理配置
- 学记:spring boot使用官网推荐以外的其他数据源druid
- Spring Boot多数据源及其事务管理配置方法
- Spring整合hibernate的事务属性介绍以及声明式事务管理 (使用Annotation和xml)
- 【spring boot】SpringBoot初学(7)– 多数据源及其事务
- 使用springboot+springsession实现分布式session以及源码解析
- spring boot + JdbcTemplate 使用druid数据源
- spring boot-Logging的配置以及使用
- SSH中Spring数据源的配置以及事务管理
- SpringBoot多数据源及事务配置
- Spring Boot 事务的使用
- Spring事务总结---传播级别以及REQUIRED_NEW及NESTED的使用场景(赞)