java 2pc 3pc 实现_分布式事务-2PC实战

Updated on 一月 2, 2017

分布式事务-2PC实战

在了解分布式事务之前,先了解一下什么是事务的基本要素及事务属性:

一、事务的基本要素

事务的四个基本要素:ACID

原子性:整个事务中的操作,要么全部完成, 要么全部不完成(全部撤销)。

一致性:事务开始之前和结束之后,数据库的完整性没有遭到破坏。

隔离性:在同一时间,只允许一个事务请求同一数据。

持久性:事务完成以后,该事务对数据库所做的操作持久化在数据库中,并不会被回滚。

二、事务的属性:

1.传播行为(事务的传递):

2.隔离级别(控制并发的弊端):

3.只读(优化);

4.超时(释放资源);

5.回滚规则(指定要不要再出错后回滚事务);

使用Spring注解管理传播行为:

// 如果有事务,那么加入事务,没有的话新建一个(默认)

1)@Transactional(propagation=Propagation.REQUIRED)

// 容器不为这个方法开启事务(如果有事务将其挂起,执行方法)

2)@Transactional(propagation=Propagation.NOT_SUPPORTED)

// 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

3)@Transactional(propagation=Propagation.REQUIRES_NEW)

// 必须在一个已有的事务中执行,否则抛出异常

4)@Transactional(propagation=Propagation.MANDATORY)

// 必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)

5)@Transactional(propagation=Propagation.NEVER)

// 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

6)@Transactional(propagation=Propagation.SUPPORTS)

//内嵌到一个事务里面,当运行到内部Transaction时会停止,执行内部的Transaction 等其执行完了才执行外部的;

7)@Transactional(propagation=Propagation.NESTED)

/*

public void methodName(){

// 本类的修改方法 1

update();

// 调用其他类的修改方法

otherBean.update();

// 本类的修改方法 2

update();

}

other失败了不会影响 本类的修改提交成功

本类update的失败,other也失败

*/

事务中经常出现的并发问题

分析几个场景:

脏读:一个事务读取了另一个事务操作但未提交的数据。

比如A、B两个事务,都操作同一张表,A刚刚对数据进行了操作(插入、修改等)但还没有提交,这时B读取到了A刚刚操作的数据,因为A有可能回滚,所以这部分数据有可能只是临时的、无效的,即脏数据。

不可重复读:一个事务中的多个相同的查询返回了不同数据。

比如A、B两个事务,A中先后有两次查询相同数据的操作,第一次查询完之后,B对相关数据进行了修改,造成A事务第二次查询出的数据与第一次不一致。

幻读:事务并发执行时,其中一个事务对另一个事务中操作的结果集的影响。

比如A、B两个事务,事务A操作表中符合条件的若干行。事务B插入符合A操作条件的数据行,然后再提交。后来发现事务A并没有如愿对“所有”符合条件的数据行做了修改~~

SQL规范定义的四个事务隔离级别

以上都是事务中经常发生的问题,所以为了兼顾并发效率和异常控制,SQL规范定义了四个事务隔离级别:

Read uncommitted (读未提交):如果设置了该隔离级别,则当前事务可以读取到其他事务已经修改但还没有提交的数据。这种隔离级别是最低的,会导致上面所说的脏读

Read committed (读已提交):如果设置了该隔离级别,当前事务只可以读取到其他事务已经提交后的数据,这种隔离级别可以防止脏读,但是会导致不可重复读和幻读。这种隔离级别最效率较高,并且不可重复读和幻读在一般情况下是可以接受的&#x

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值