SQL 事务(Transaction)存储过程加事务 179

#妙笔生花创作挑战#事务(Transaction)事务:是逻辑上的一组操作由一系列对系统中数据进行访问与更新的操作所组成的一个 程序执行逻辑单元(Unit)

#神奇彭申花创意挑战#

事务(Transaction)

事务:是访问和更新系统中的数据的操作的逻辑集合。的特点是要么运行,要么都不运行。的目的是保证数据的完整性。

简单来说,如果在:事务中执行语句时没有发生错误,则所有SQL语句都会被执行;如果中间语句发生错误,则之前执行的所有SQL语句都会被回滚。

begin tran; 更新银行集资金=’张三’; 更新银行集资金=’李四’; 注意:tran 是可滚动的。返回一般交易:1)假设张三的卡上只有30,转账100会导致错误,没有完成整个交易的报表。 2)假设李四没有收到卡或转账金额。如果不正确,张三之前的改造语句会回滚四大功能,对应无转账交易:

原子性: 事务必须执行所有数据更改,或者不执行任何数据更改。

一致性: 当事务完成时,前后所有数据必须相同。

例如,在:张三向李四发送了100元。汇款前后的数据都是正确的。这称为一致性。即使张三转账100元,李四的账户也不会增加100元。我收到数据不一致的错误。

隔离: 事务的执行不受其他事务的干扰。这意味着即使多个用户同时访问数据库,您的数据也不会受到影响。

持久性: 一旦事务完成,它对系统的影响是永久性的,即使系统发生故障,更改也会保留。

交易申请表

begin tran – 声明一个变量,用于确定下一条语句- 确定事务中的SQL 语句最终是执行还是回滚- 如果变量要执行,则确定SQL 语句的结果commit tran – else 如果Result 为true,则回滚tran – – 结果为false 回滚示例: 张三给李四汇款(默认每次1000元)

1 创建样本表bank,字段BId(卡号)BName(用户名)BMoney(金额)。

–1创建样本表bankUSE School;CREATE TABLE Bank(BId INT IDENTITY(1,1) PRIMARY KEY,–卡号BName VARCHAR(10), –用户名BMoney INT DEFAULT(1000) –金额)–添加对应为每个账户需要预留10元的支票约束alter table dbo.Bank ADD CONSTRAINT CH_bank check (BMoney=10)–插入数据INSERT INTO Bank(BName) SELECT N’张三’ UNIONSELECT N’李四’从银行14b6986dfce2499983fbc76d9642a5ec~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717832252&x-signature=BUeCbjEQJ2G%2BVyHEdKjhQNV3IBs%3D 选择*

2 创建/测试事务应用程序

–执行交易前显示数据SELECT * FROM Bank–创建/测试交易应用程序BEGIN TRANDECLARE @rmb INT=100DECLARE @errorTimes INT –错误数SET @errorTimes=0 –将错误数设置为0- – 写传输要执行的SQL 语句UPDATE Bank SET BMoney=BMoney-@rmb WHERE BName=N’张三’–@@ERROR 如果执行上述SQL 语句出错–@@ERROR 为0SET @errorTimes=@errorTimes+ @@ERRORUPDATE Bank SET BMoney=BMoney+@rmb WHERE BName=N’Li Si’SET @errorTimes=@errorTimes+@@ERROR — 判断@errorTimes是否等于0IF @errorTimes=0 –无错误COMMIT TRAN –执行事务内的SQL语句ELSE ROLLBACK TRAN –回滚事务内的SQL语句–执行事务后显示数据SELECT * FROM Bank 将变量的值设置为@rmb=2000 更改自检结果注意事项:这里使用了全局变量@@error。具体用法我之前已经讲过,不再重复。

06753106d0d8464497348e9b6d08a159~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717832252&x-signature=HqHGhYph6DQYshZELYKCSC6WhPA%3D 交易执行前后的数据

存储过程加事务

1 创建转账交易的存储过程

CREATE PROC usp_bank_transfer@outname VARCHAR(10),–转账账户@inname VARCHAR(10),–转账账户@tranmoney INT,–转账金额@isSuccese BIT OUTPUT –输出参数–转账成功标识:0 失败1 Success ABEGIN DECLARE @errortimes INT SET @errortimes=0 — 默认无错误SET @isSuccese=0 — 默认返回false BEGIN TRAN BEGIN TRY UPDATE Bank SET BMoney=BMoney-@tranmoney WHERE BName=@outname SET @ errorTimes=@errorTimes+ @@ERROR UPDATE Bank SET BMoney=BMoney+@tranmoney WHERE BName=@inname SET @errorTimes=@errorTimes+@@ERROR IF @errortimes=0 BEGIN COMMIT TRAN –执行上述转账SQL语句SET @isSuccese=1 – – 返回成功传输的标识符。 END ELSE ROLLBACK TRAN END TRY BEGIN CATCH ROLLBACK TRAN END CATCH END 注: 以上SQL 语句仅用于说明存储过程和事务的使用。实际开发中,所有的参数数据都是在执行前处理完的。 SQL 语句。确认预留转账金额不少于10。 2、添加引用,写入配置文件信息,写入表单加载事件,实时显示数据。

//提取方法内部。 dt最好在一个方法内声明DataTable dt=null;private void Form1_Load(object sender, EventArgs e){ //调用加载数据的方法LoadData();}//在加载数据的方法中Extract 以便于复用私人无效LoadData(){字符串sql=’从银行选择*’dt=Helper.SQLHelper.ExecuteDataTable(sql);} f6c3c03c100d405f93e7abe470378083~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717832252&x-signature=5x1ebL%2F5KaA5zJHx%2Baye63qtimE%3D

3.添加传输按钮点击事件,用于每次传输后重新查询数据显示。

private void btnTran_Click(object sender, EventArgs e){ //自己写的,检测三个文本框的值是否满足特定需求//设置存储过程的参数信息SqlParameter[] ps={ new SqlParameter(‘ @outname’,txtTranOut.Text), new SqlParameter(‘@inname’,txtTranIn.Text), new SqlParameter(‘@tranmoney’,txtRMB.Text), new SqlParameter(‘@isSuccese’,SqlDbType.Bit) }; /设置输出参数ps[ 3].Direction=ParameterDirection.Output; //调用存储过程方法Helper.SQLHelper.SP_ExecuteNonQuery(‘usp_bank_transfer’,ps); //输出参数的值获取并判断0 失败1 成功bool b=Convert.ToBoolean(ps[ 3].Value); if (b) { MessageBox.Show(‘传输成功’) } else { MessageBox.Show(‘传输失败’);无论是否成功,都重新查询绑定数据转账是否成功并显示每个账户当前金额LoadData();} a15689f0ef9a41baa150d6d737534779~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717832252&x-signature=nafkDv0oUCx%2BTqBcMGj2H1elLVA%3D 实现转账

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85470.html

(0)
小条's avatar小条
上一篇 2024年6月1日 下午3:37
下一篇 2024年6月1日 下午3:44

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注