net中的4种事务总结

.Net基础类库适用手册 官方中文版 .net framework 4.7.2,.net core 2.1,基础类库使用手册,官方中文版。 System.AppContext、System.Data、System.Net、System.Http、System.IO、System.Web、System.XML、System.Runtime、System.*,包含所有基础类库 立即下载

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。

1 SQL事务

sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)

CREATE PROCEDURE dbo.SPTransaction
    (
    @UpdateID int,
    @UpdateValue nchar(50),
    @InsertID int,
    @InsertValue nchar(50)
    )
AS
begin Tran
Update Region  Set RegionDescription=@UpdateValue where RegionID=@UpdateID

insert into Region Values (@InsertID,@InsertValue)

declare @RegionError int
select @RegionError=@@error
if(@RegionError=0)
COMMIT Tran
else
ROLLBACK Tran
GO
        /// <summary>
        /// SQL事务:
        /// </summary>
        public void SQLTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SPTransaction";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            conn.Open();
            SqlParameter[] paras= new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
            paras[0].Value = "2";
            paras[1].Value = "Update Value1";
            paras[2].Value = "6";
            paras[3].Value = "Insert Value1";
            foreach (SqlParameter para in paras )
            {
                cmd.Parameters.Add(para);
            }
            cmd.ExecuteNonQuery();   
        }

2 ADO.net事务

Ado.net事务可能是大家一般都用的
优点:简单,效率和数据库事务差不多。
缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:

/// <summary>
        /// 一般的ADO.net 事务
        /// </summary>
        public void ADONetTran1()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            try
            {
                cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                conn.Open();
                SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                paras[0].Value = "2";
                paras[1].Value = "Update Value12";

                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }
                //开始事务
                cmd.Transaction = conn.BeginTransaction();
                cmd.ExecuteNonQuery();


                cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                cmd.CommandType = CommandType.Text;

                paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                paras[0].Value = "7";
                paras[1].Value = "Insert Value";

                cmd.Parameters.Clear();
                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }

                cmd.ExecuteNonQuery();
                //提交事务
                cmd.Transaction.Commit();
            }
            catch
            {
                //回滚事务
                cmd.Transaction.Rollback();
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

3 TransactionScope事务

TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
优点:实现简单,同时能够自动提升为分布式事务
Demo:

 /// <summary>
        /// TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。 
        /// 使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:net start msdtc命令开启服务;
        /// </summary>
        public void ADONetTran2()
        {
             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
             SqlCommand cmd = new SqlCommand();
            try
            {

                using (System.Transactions.TransactionScope ts = new TransactionScope())
                {

                    cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                    paras[0].Value = "2";
                    paras[1].Value = "Update Value12";

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();


                    cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                    paras[0].Value = "8";
                    paras[1].Value = "Insert Value";

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();
                    //提交事务
                    ts.Complete();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

4 COM+事务

在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:

/// <summary>
        /// COM+事务
        /// </summary>
        public void ComTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            ServiceConfig sc = new ServiceConfig();

            //指定事务类型
            sc.Transaction = TransactionOption.Required;
            //设置启动跟踪
            sc.TrackingEnabled = true;
            //创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。
            //随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
            //接着,新的上下文被推至上下文堆栈,成为当前上下文
            ServiceDomain.Enter(sc);
            try
            {
                    cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                    paras[0].Value = "2";
                    paras[1].Value = "Update Value22";

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();


                    cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                    paras[0].Value = "9";
                    paras[1].Value = "Insert Value";

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();

                    //提交事务
                    ContextUtil.SetComplete();
            }
            catch
            {
                //回滚事务
                ContextUtil.SetAbort();
                throw;
            }
            finally
            {
                conn.Close();
                //触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
                //然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。
                ServiceDomain.Leave();
            }

        }

在.net中还有些也能进行事务处理,如web Service中

需要特别补充的是:
如果你使用的是分布事务(TransactionScope事务和COM+事务),在默认情况下你是要重新配置安装SQL Server数据库服务器和访问数据库的客户端的.(如果没有配置运行会出现以下错误:该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。
实际怎么配置呢,经过我的实际使用:大致如下:打开’控制面板’->’管理工具’->’组件服务’,点开’组件服务’->’计算机’->’我的电脑’,在’我的电脑’上右击属性,点’MSDTC‘,然后点’安全性配置’。作为数据库的服务器的配置如下:
这里写图片描述
而访问数据库的客户端的配置和服务器端的稍有些差别:
这里写图片描述
在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%/system32/msdtc.exe MSDTC enable命令就可以了

ASP.NET中的自动化事务

通过在ASP.NET页面中添加Transaction属性,可使得ASP.NET能够在系统中支持自动事务。利用Transaction属性,开发人员能够指示页面参与现有事务,开始新事务,或者不参与事务。下表列举了ASP.NET中可用的Transaction属性值。

通过在代码中的Page指令中设置Transaction属性能够定义页面支持的事务级别。例如,插入以下指令能够保证页面活动总是在事务范围中执行:

<%@ Page Transaction="Required" %>

如果省略Transaction属性,页面则禁用事务。使用System.EnterpriseServices.ContextUtil类的静态方法在ASP.NET页面中提交或者放弃事务。这些静态方法是SetComplete()和SetAbort()(它们分别对应Page事件CommitTransaction()和AbortTransaction())。以下代码列举了页面实现框架,该页面将Page指令的Transaction属性设置为Required,同时在CommitTransaction()和AbortTransaction()事件中,编写处理事务结果所需的代码。

void Page_Load(object sender, System.EventArgs e)
   {
       AbortTransaction += new System.EventHandler(AbortTransactionEvent);
       CommitTransaction += new System.EventHandler(CommitTransactionEvent);
       try
        {
             /* 在这里放置事务性代码 */
             ContextUtil.SetComplete();
         }
        catch (Exception)
         {
             ContextUtil.SetAbort();
         }
        }
        void AbortTransactionEvent(object sender, System.EventArgs e)
        {
            /*用于回滚行为的代码*/
        }
        void CommitTransactionEvent(object sender, System.EventArgs e)
        {
            /*用于提交行为的代码*/
        } 
    }

4. 何时使用事务

虽然.NET 2.0对事务提供了很好的支持,但是没有必要总是使用事务。使用事务的第一条规则是,在能够使用事务的时候都应该使用事务,但是不要使用过度。原因在于,每次使用事务,都会占用一定的开销。另外,事务可能会锁定一些表的行。还有一条规则是,只有当操作需要的时候才使用事务。例如,如果只是从数据库中查询一些记录,或者执行单个查询,在大部分时候都不需要使用显式事务。

开发人员应该在头脑中始终保持一个概念,就是用于修改多个不同表数据的冗长事务会严重妨碍系统中的所有其他用户。这很可能导致一些性能问题。当实现一个事务时,遵循下面的实践经验能够达到可接受的结果:(1)避免使用在事务中的SELECT返回数据,除非语句依赖于返回数据;(2)如果使用SELECT语句,只选择需要的行,这样不会锁定过多的资源,而尽可能的提高性能;(3)尽量将事务全部写在T-SQL或者API中;(4)避免事务与多重独立的批处理工作结合,应该将这些批处理放置在单独的事务中;(5)尽可能避免大量更新。
另外,必须注意的一点就是事务的默认行为。在默认情况下,如果没有显式的提交事务,则事务会回滚。虽然默认行为允许事务的回滚,但是显式回滚方法总是一个良好的编程习惯。这不仅仅只是释放锁定数据,也将使得代码更容易读并且更少错误。

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备 【WRF数据准备】MODIS静态地理数据下载及制备 阅读详情

相关推荐

eNSP-Pro配置又丢了?手把手教你用导出功能防患于未然

本文详细介绍了eNSP-Pro配置防丢失的全套方案,包括运行时内存、虚拟存储设备和宿主机文件系统的配置存储机制,以及多维度备份策略和特殊场景下的恢复技巧。通过优化保存流程、自动化定时导出和版本化管理,帮助网络工程师有效防止配置丢失,提升工作效率。

weixin_42665725的博客 238

.Net Core 学习——事务

https://www.cnblogs.com/wanchenggui/p/10191603.html 1:事务是什么   事务指的是一系列SQL操作的逻辑工作单元,,要么完全地执行,要么完全地不执行。   一个逻辑工作单元必须有4个属性,原子性(Atomic)、一致性(Consistent)、隔离型(Isolated)、持久性(Durable),简称为ACID。 ...

Abbey_qi的博客 1200

国产安路FPGA(二)-TD软件时序约束与硬件调试实战

本文深入探讨了国产安路FPGA开发中TD软件时序约束的实战应用。文章详细解析了SDC文件的核心语法,包括基础时钟、生成时钟及输入输出延迟约束的编写方法,并针对硬件调试中常见的时序问题提供了解决方案。通过一个图像处理流水线的优化案例,阐述了如何结合代码修改与约束设置,实现设计从“能跑”到“跑得稳”的关键提升,是掌握FPGA可靠设计的实用指南。

weixin_29183637的博客 376

.NET Core中使用EF Core实现事务处理(详解)

平常项目中设计到数据库操作的时候一般情况是不会有问题的,但是当一个控制器中设计到多处具有对数据库的操作时,比如一个接口中涉及到修改信息,然后删除原本信息,分配新的权限三个操作,如果运行到一半数据库突然出现故障后,导致后面还有的操作没有进行,就会到处信息出现问题.当然EF Core提供的方法本身是支持事务的,如果多个操作,其中任何一个操作失败了,都会触发事务回滚,保证所有操作都不会生效。但在我们实际业务中,业务往往都是比较复杂的,默认事务无法满足我们的需求,这时候我们就需要手动控制事务,

xll的博客 3726

1篇1章4节:生成对抗网络GAN和图像生成领域的StyleGAN

AI图像生成技术的革命性突破:从GAN到StyleGAN 近年来,人工智能在图像生成领域取得显著进展,尤其是生成对抗网络(GAN)的发展推动了技术的飞跃。从早期的基础GAN到渐进式GAN(Progressive GAN),再到革命性的StyleGAN,AI生成图像的逼真度已接近人类创作水平。StyleGAN通过引入风格潜向量和自适应实例归一化,实现了对图像风格与内容的精细控制,广泛应用于人脸生成、艺术创作及影视行业。后续的StyleGAN2解决了“斑点”问题,StyleGAN3进一步优化纹理过渡,提升了图像

MD Code 213

PowerDesigner 数据库建模使用详解

PowerDesigner 数据库建模使用详解

congge 7081

.net core 事务

需要注意的是,在使用 Entity Framework Core 中的事务时,建议使用 using 块来确保事务在使用完毕后得到正确地释放和处理。总之,在正确配置和使用的情况下,TransactionScope 应该能够确保在 SQL Server 和 MySQL 数据库操作中的事务正常回滚。在 .NET 中使用 TransactionScope 来执行 SQL Server 和 MySQL 数据库操作时,只有在两个数据库都支持分布式事务(DTC)并且配置正确的情况下,事务才能正确回滚。

qq_41942413的博客 892

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

.NET Core 中实现分布式事务的几种方案

在这种方案中,分布式事务的实现基于消息队列的支持,如 RabbitMQ、Kafka 等。在这种方案中,使用分布式事务协调器来协调不同数据库或服务之间的事务,确保所有操作的原子性和一致性。在 .NET Core 中,可以使用开源的分布式事务协调器 Seata 或 NServiceBus 来实现分布式事务的协调。所以,实现分布式事务是一个复杂的过程,需要综合考虑多个方面的因素。不同的方案有其优缺点和适用场景,需要根据实际需求选择合适的方案,并注意方案的实现细节和注意事项,以确保分布式事务的可靠性和一致性。

polsnet的专栏 2782

【异常】Cursor导入Karpathy指南失败解决方案Failed to import GitHub/GitLab rules: Error executing git: Cloning into

摘要:本文解决了Git克隆单个文件报错的问题,指出git clone只能克隆整个仓库而非单个文件。提供了两种解决方案:1) 推荐手动创建规则文件,在Cursor项目中新建.mdc文件并粘贴Karpathy行为指南完整内容;2) 备选克隆整个仓库获取文件。指南包含编码行为规范,强调简单性、精准修改和明确目标。还说明了如何设置全局规则和即时生效的方法。

奶爸的编程之路,也就一周冷个三天 174

q-learning精讲

Q-learning Q-learning是一种用于机器学习的强化学习技术。 Q-learning的目标是学习一种策略,告诉Agent在什么情况下要采取什么行动。 它不需要环境模型,可以处理随机转换和奖励的问题,而无需进行调整。 对于任何有限马尔可夫决策过程(FMDP),Q学习找到一种最优的策略,即从当前状态开始,它在任何和所有后续步骤中最大化总奖励的预期值。在给定无限探索时间和部分随机策略的情况...

weixin_41697507的博客 1万+

情绪识别系统设计与落地:从工业实践到合规部署

情绪识别是人机交互与智能服务中的关键感知能力,其核心在于融合多模态信号理解用户心理状态。技术原理上需兼顾人脸微表情建模、语音韵律分析或文本语义挖掘,并解决光照变化、姿态偏移、类别不平衡等实际挑战。其技术价值不仅体现在用户体验优化,更延伸至金融风控、远程教育质量评估、心理健康初筛等高价值场景。当前主流方案已超越OpenCV+Haar的传统范式,转向轻量化CNN/ViTs与边缘推理协同架构,同时需满足ISO/IEC 23053等可信AI认证要求。本文聚焦真实项目约束下的系统选型、鲁棒性增强与部署陷阱规避。

diaohuyi6830的博客 429

【我的Android进阶之旅】异常: Problems reading data from Binary store in Local\Temp\gradlexxx.bin (exist: true)

一、异常描述 今天开个会议,电脑自动关机了,重启电脑之后,打开Android Studio,编译代码,就编译失败,如下所示:异常提示 : Caused by: java.lang.RuntimeException: Problems reading data from Binary store in C:\Users\000\AppData\Local\Temp\gradle6337489649031706149.bin (exist: true) Caused by: java.lang.Runtime

字节卷动 3821

.NET 4将支持用软件实现的事务内存

事务内存是一种并行程序设计的方式,其来自于数据库管理系统(DBMS)中的事务(Transaction)概念。事务内存目前有两种实现方式,基于软件的STM(Software Transactional Memory)和基于硬件的HTM(Hardware Transacational Memory)。   虽然事物内存的事务编程概念来自于数据库的事务,但在概念上还是有很...

weixin_33860147的博客 89

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

.net中的4种事务总结

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。1 SQL事务    sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran

山里娃的专栏 847

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

asp.net mysql 事务_net中的4种事务总结

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。1 SQL事务sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Com...

weixin_39765057的博客 136

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

asp.net中的4种事务

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。 1 SQL事务     sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback

chy2z的专栏 548

.net中的4种事务【转帖】

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。1 SQL事务 sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran...

weixin_33753003的博客 197
上一篇: 让AutoMapper在你的项目里飞一会儿
下一篇: Bootstrap模态框(Modal)
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值