分布式事务 原理及使用范例一则

本文通过转账案例阐述了在软件开发和数据库操作中确保数据一致性的需求,并介绍了如何利用TransactionScope实现跨数据库、跨机器的分布式事务处理。

摘要:在软件开发和数据库操作中,常常出现须要共同进退的情况。要么一起成功。要么一起失败。

如果案例:A向B转账3000元rmb。
update Account set Amount=Amount-3000 where name='a'
update account set Amount=Amount+3000 where name='b'
场景:如果在第1行代码运行成功。第2行代码还未运行的情况下。未继续运行。

结果:A的钱没了!B没收到钱!

此时推荐使用分布式事务来解决这类问题。


解决方式
应该实现原子性:要么所有成功、要么所有失败(回滚)

事务:
事务(Transaction)的特征是“原子性”。也就是“要么所有成功。要么所有失败”。

事务实现还是有非常多方法。最常见的就是使用链接相关SqlTransaction

SqlTransaction
长处:1 不须要做client、server端的配置。2 无须启用事务协调服务(MSDTC)
缺点:无法实现分布式事务、嵌套事务、编写麻烦。


TransactionScope用来实现分布式事务(能够跨数据库、跨机器操作)的步骤
1 Windows服务中开启MSDTC(Distributed Transaction Coordinator)。而且启动类型改为“自己主动”。注意:须要在ADO.NET端和数据库端上须要都进行同样操作。

2 项目加入对System.Transactions的引用
代码范例:
//包起来就会两者一起。一起成功。或者一起失败
using(TransactionScope ts=new TransactionScope())
{
    "update Account set Amount=Amount-3000 where name='a'";//从A账户扣钱的操作
    "update account set Amount=Amount+3000 where name='b'"//向B账户添加钱的操作
    ts.Complete();//忘记这句话。两个都插入失败
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值