事务

事务

1. 事务的特点

(ACID) Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性。

  • 原子性:事务是数据库的逻辑工作单位,事务中包含的各操作要么都完成,要么都不完成。
  • 一致性:事务一致性是指数据库中的数据在事务操作前后都必须满足业务规则约束。
  • 隔离性: 一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性:事务一旦提交,结果便是永久性的。即使发生宕机,仍然可以依靠事务日志完成数据的持久化。

2.事务的隔离级别

  • read uncommitted 未提交读:所有事务都可以看到没有提交事务的数据。
  • read committed 提交读:事务成功提交后才可以被查询到。(达梦和Oracle的默认级别 )
  • repeatable 重复读:一个事务只能读取到另一个已提交事务修改过的数据,但是第一次读过某条记录后,即使其它事务修改了该记录的值并且提交,之后该事务再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读。mysql默认级别。
  • Serializable可串行化: 强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。

3.事务的传播行为

解决业务层之间调用事务的关系,只有两个业务类的方法相互调用时,传播行为才会有效。

  • PROPAGATION_REQUIRED(必须的):事务A,B。 如果A有事务,B使用A的事务,如果A没有事务,则B就新开一个事务。(A、B在同一个事务当中)默认配置。
  • PROPAGATION_SUPPORTS(支持的):事务A,B。如果A有事务,B使用A的事务,如果A没有事务,B也不使用事务。
    PROPAGATION_MANDATORY: 事务A,B。如果A有事务,B使用A的事务,如果A没有事务,抛出异常。
  • 还有以下几种:
    在这里插入图片描述

4.JDBC如何实现事务

DML(数据库操作语言)默认情况下,一旦执行就会默认提交,可以通过setAutocommit=false的方式取消DML操作的自动提交。实现事务,需要取消DML操作和连接的自动提交,当DML全部执行完之后,提交数据,一旦过程中出现异常,回滚。

5.Spring 申明式事务

@Transactional 添加到service实现类上,可以添加属性值,如重播行为、异常的回滚机制(默认不回对非运行时异常进行回滚,可通过添加rollbackFor = {Exception.class} 实现对所有异常进行回滚)

6.分布式事务

一次大的操作由若干小的操作组成,这些小的操作分布在不同的服务器上,且属于不同应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败,从本质上来说,分布式事务就是为了保证不同的数据库的数据一致性。
分布式事务又区分为刚性事务和柔性事务:

  • 刚性事务(强一致性):2pc,两阶段提交(XA协议)
    第一阶段:事务管理器要求每个涉及事务的数据库预提交操作,并反应是否可以提交
    第二阶段:事务协调器要求每个涉及事务的数据库提交或者回滚操作。
    优点是尽量保证了数据的强一致性,实现成本较低,各大主流数据库也有自己的实现支持。缺点是事务管理器存在单点问题以及资源管理器准备就绪之后的同步阻塞,对高并发场景不友好。
    (TCC Try-Confirm-Cancel: 相比于XA, 解决了几个缺点,解决协调者单点问题,由业务方发起并完成业务活动,同步阻塞引入超时,超时后进行补偿)
  • 柔性事务(最终一致性):使用异步的方式来进行分布式事务控制。
    使用本地消息表(核心是把大事务变成小事务)、基于MQ实现。
    适用于并发量高、一致性要求不敏感、执行时间长的业务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值