被面试分布式事务

好难的一个问题啊,之前浅浅玩过JTA(JOTM),现在发现远远没那么简单 

对于分布式事务目前业界存在很大的纷争,有一种的要求强一致性的一方,有的说放弃强一致性,先不看场景,先瞧瞧1PC,2PC,3PC 但是由于事务之间的隔离性,强一致性只是一个美丽的梦,比如2PC,第一阶段就存在超时和异常,同样callback和commit也会有超时的,哪个阶段超时?如果再commit超时的话,甚至还有不完全提交的情况,即便是提交了,也不敢保证都完成commit是没有状态的,在不完全提交的时候也要做特殊处理,特别是最后一次做commit的时候根本不知道他的情况,redo log或许能解决二次提交的问题。无论如何2PC,3PC只是一种策略,锁会让等待时间延长,特别是数据库出现问题的时候,更加严重,一个大型网站不用说是要挂掉的。

2PC,3PC大型的企业没见过用,ebay,支付宝都没有用,原因就是其性能低下,JTA开发的程序必然是性能低下的,简单却是真的。

在eay有人提出用中间状态消息队列和消息应用状态表 详见: http://wangyuanzju.blog.163.com/blog/static/1302920086424341932/

### 常见分布式事务面试问题及解答 #### 什么是分布式事务分布式事务是指在一个分布式系统中,涉及多个独立的服务或数据库的操作需要作为一个整体来执行。要么所有的操作都成功提交,要么全部回滚,保持数据的一致性[^1]。 #### Seata 是什么?它的主要功能有哪些? Seata 是一款开源的分布式事务解决方案,旨在提供高性能易于使用的分布式事务服务。它支持多种事务模式,包括 AT(自动补偿)、TCC(尝-确认-取消)、SAGA(状态机编排)以及 XA 模式,帮助开发者构建可靠的分布式应用环境。 #### 分布式事务的核心挑战是什么? 分布式事务的主要难点在于如何确保跨不同节点的数据一致性。具体来说,在网络分区、硬件故障或其他不可控因素下,仍然能够保证 ACID 属性中的原子性隔离性[^2]。 #### 两阶段提交 (2PC) 的原理及其优缺点是什么? 两阶段提交是一种经典的分布式事务协议,用于实现强一致性。其工作流程如下: - **第一阶段(表决阶段)**:所有参与者将当前事务的状态预提交,并向协调者报告是否可以继续。 - **第二阶段(执行阶段)**:协调者汇总所有参与者的反馈,决定全局提交还是回滚,并通知所有参与者同步执行相应动作。 优点: - 提供了严格的事务一致性保障。 缺点: - 性能开销较大,尤其是在高并发场景下容易成为瓶颈; - 如果协调者发生故障,则可能导致部分参与者处于不确定状态,影响系统的可用性[^3]。 #### Redis 分布式锁的工作机制是什么? Redis 实现分布式锁通常通过 SETNX 指令完成加锁逻辑。当客户端请求获取某个资源对应的锁时,会尝设置该键值对;如果返回值为 `true` 则表示成功获得独占权限,反之则需等待重机会。为了防止死锁现象的发生,一般还会设定一个合理的过期时间作为保护措施。另外需要注意的是,某些框架还引入了看守进程的概念,用来动态延长有效期限从而避免因意外中断而导致误释放的情况出现[^4]。 ```python import redis def acquire_lock(client, key, timeout=10): identifier = str(uuid.uuid4()) end_time = time.time() + timeout while time.time() < end_time: if client.set(key, identifier, nx=True, ex=timeout): return identifier time.sleep(0.01) raise Exception("Failed to acquire lock") def release_lock(client, key, identifier): script = """ if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end""" return client.eval(script, 1, key, identifier) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值