#神奇彭申花创意挑战#
事务(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’李四’从银行 选择*
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。具体用法我之前已经讲过,不再重复。
交易执行前后的数据
存储过程加事务
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);}
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();} 实现转账
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85470.html