您的位置:首页 > 编程语言 > Java开发

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()时会创建一个新的事务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: