1.怎样理解(什么是)事务?
当同一个操作需要多条sql执行,一条执行失败,其余哪怕执行成功了也要回滚数据;除非所有的sql都完美的执行成功了。
2.事务是什么时候回滚的?
runtimeExcetion的时候
3.Spring事务
Spring事务有声明式事务和编程式事务,
而声明式事务的原理是AOP,AOP又是通过动态代理实现的。
Spring声明式事务优点:
1.解耦
2.我们只需要写业务,不需要关注事务。
Spring声明式事务缺点:
是方法级别的事务控制,只能对方法进行事务控制,不能对方法的某几行进行事务控制。
4.事务传播行为
指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

5.数据库事务特性
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
6.数据库事务的隔离级别
MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
7.分布式事务
第一种方案:最终一致性,需要业务系统结合 MQ 消息中间件实现,在实现过程中需要保
证消息的成功发送及成功消费。即需要通过业务系统控制MQ 的消息状态
第二种方案:实时性分布式事务,TCC 框架
最终一致性:
一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
第一步:首先主动方有个预处理的动作,就是插入一条数据到数据库
(可以单独抽离出来一个服务器,任何主动方都是通过数据源连接这个数据库,
给数据源一个IP地址就可以连接这个数据库)表中,
这条数据的状态为待确认,然后执行生产者的业务代码时,如果失败就回滚,捕捉异常,把预处理的这条数据给删除了,
数据库就没有数据了,消费方就不会有消息执行。双方数据一致。
如果成功的话,修改数据的状态,把待确认改为待发送,再把信息发给MQ,
在MQ发送信息到消费方有可能导致数据丢失,消费方无法接收信息,那么之前插入数据库中那条数据还是处于待发送状态,
正常情况下消费方如果能接收数据,处理完消费方就会链接到数据库把待发送那条信息删除,删除成功就说明主动方跟消费方都执行成功.
直接删除,不做物理删除,原因:数据量会越来越多。导致服务器的查询速度变慢。
如果数据丢失,消费方无法接收信息,生产者有个定时任务,会不断去数据库找状态为待发送的那条记录,
如果找到待发送这条数据就再次把信息发到MQ,因为不会无限次数发送,因此如果发送6次均为失败就会转人工客服,
度变慢。
如果数据丢失,消费方无法接收信息,生产者有个定时任务,会不断去数据库找状态为待发送的那条记录,
如果找到待发送这条数据就再次把信息发到MQ,因为不会无限次数发送,因此如果发送6次均为失败就会转人工客服,
比如发送短信通知客服,客服去排查哪条消息再告诉运维,在排查消费端为什么接收不到,这样就可以保证数据的最终一致性.
170万+

被折叠的 条评论
为什么被折叠?



