ADO.NET学习之SqlTransaction
来源:互联网 发布:减肥时晚餐吃什么知乎 编辑:程序博客网 时间:2024/06/05 11:14
ADO.NET学习之SqlTransaction
事务是一组必须全部成功或全部失败的操作。事务的目标是保证数据总能处于有效一致的状态。
事务有4个被称为ACID属性的特征:
- Atomic(原子性):事务中所有的步骤必须同时成功或失败。只有事务中的所有步骤全部完成了,才能认为一个事务结束
- Consist(一致性):事务使底层数据库在稳定状态间转换
- Isolated(隔离性):每个事务都是独立的实体。一个事务不能影响同时运行的其他事务
- Durable(持久性):在事务成功之前,事务产生的变化永久的存储在媒质上,通常是硬盘上。必须维护日志以保证即使出现硬件故障或网路失败,数据库也能恢复到有效状态
以转账场景为例,假设有如下的2个账户:
从账户A1转10元到A2账户,先从A1账户中扣除10,再在A2账户中添加10。如果从A1的账户中扣除了钱,而A2账户中确没有添加钱,这种情况就是不可接受的。所以,2步要么都要成功,要么就都要失败,如果一个成功,一个失败,就要回滚操作,来保持数据的完整性。在ADO.NET中可通过transactions事物来完成。
第一步,创建表,并添加数据
Create Table Accounts( AccountNumber nvarchar(10) primary key, CustomerName nvarchar(50), Balance int)Insert into Accounts values('A1', 'Mark', 100)Insert into Accounts values('A2', 'Steve', 100)
第二步,创建页面
<div style="font-family: Arial"><table border="1" style="background: brown; color: White"> <tr> <td> <b>Account Number </b> </td> <td> <asp:Label ID="lblAccountNumber1" runat="server"></asp:Label> </td> <td> <asp:Label ID="lblAccountNumber2" runat="server"></asp:Label> </td> </tr> <tr> <td> <b>Customer Name </b> </td> <td> <asp:Label ID="lblName1" runat="server"></asp:Label> </td> <td> <asp:Label ID="lblName2" runat="server"></asp:Label> </td> </tr> <tr> <td> <b>Balance </b> </td> <td> <asp:Label ID="lblBalance1" runat="server"></asp:Label> </td> <td> <asp:Label ID="lblBalance2" runat="server"></asp:Label> </td> </tr></table><br /><asp:Button ID="btnTransfer" runat="server" Text="Transfer $10 from Account A1 to Account A2" OnClick="btnTransfer_Click" /><br /><br /><asp:Label ID="lblMessage" runat="server" Font-Bold="true"></asp:Label></div>
第三步,转账事件
protected void btnTransfer_Click(object sender, EventArgs e) { string cs = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString; using (SqlConnection con = new SqlConnection(cs)) { con.Open(); SqlTransaction transaction = con.BeginTransaction(); try { SqlCommand cmd = new SqlCommand( "Update Accounts set Balance = Balance - 10 where AccountNumber = 'A1'", con, transaction); cmd.ExecuteNonQuery(); cmd = new SqlCommand( "Update Accounts1 set Balance = Balance + 10 where AccountNumber = 'A2'", con, transaction); cmd.ExecuteNonQuery(); transaction.Commit(); lblMessage.ForeColor = System.Drawing.Color.Green; lblMessage.Text = "Transaction committed"; } catch { transaction.Rollback(); lblMessage.ForeColor = System.Drawing.Color.Red; lblMessage.Text = "Transaction rolled back"; } GetAccountsData(); } }
创建SqlCommand
的时候,使用public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction);
方法
开始事务SqlTransaction transaction = con.BeginTransaction();
提交事务transaction.Commit();
回滚事务transaction.Rollback();
为了测试事务可以在Commit()
方法之前,产生一个异常,如
throw new ApplicationException();
隔离级别
隔离级别决定了事务对其他事务影响的数据的敏感度。例如,默认情况下当两个事务独立运行时,在第一个事务结束前,第一个事务插入的数据对其他事务不可见。
隔离级别的概念和锁的概念紧密相关,因为确定事务的隔离级别就是确定所需的锁的类型。共享锁是事务读取数据库中的数据时产生的锁。当表、行或某个范围内有共享锁时,其他事务就不可以修改相应的数据,但多个用户可以使用共享锁并发读取数据。独占锁禁止多个事务同时修改数据。当事务更新数据且没有其他事务锁定数据的时候,会产生独占锁。当有独占锁时,其他用户不能读取或更新数据。
在SQL Server存储过程中,使用SET TRANSACTION ISOLATION LEVEL
命令来设置隔离级别。在ASP.NET中,可以向Connection.BeginTransaction()
方法传入IsolationLevel
枚举值。
IsolationLevel
枚举值
脏读是指读取了其他尚未提交的事务中的数据,但该事务可能被回滚
不可重复读如果允许不可重复读,那么在同一个事务执行多次查询可能会得到不同的数据。这是因为事务进行过程中只读数据并不能阻止其他用户修改数据。为了防止不可重复读,数据库服务器需要锁定事务读取的行
幻读时指在初始读取中没有出现但在相同事务内后续读取出现的行。事务进行过程中其他用户插入记录,就可能出现幻读。为了防止幻读,事务进行过程中查询数据库时要根据WHERE
子句使用一个范围锁
大多数情况下,不可重复读和幻读只是小问题,使用锁阻止它们发生并发的代价有点太高了,不太值得。默认情况下,ReadCommitted
对大多数事务都适用
隔离级别对比
资料
- Part 21 - Transactions in ADO.NET
- ADO.NET学习之SqlTransaction
- 黑马程序员之ADO.NET学习笔记: SqlTransaction(事务)
- SqlTransaction、SqlConnection和SqlCommand对象实现ADO.NET事务处理
- ADO.NET学习之SqlCommandBuilder
- 黑马程序员之ADO.NET学习笔记:ADO.NET介绍
- C#学习笔记之五(ADO.net)
- C#学习笔记之五(ADO.net)
- 黑马程序员之ADO.net学习
- ADO.NET学习之SqlConnection,SqlCommand
- ADO.NET学习之SqlDataAdapter,DataSet
- ASP.NET学习笔记之ADO.NET(一)
- ASP.NET学习笔记之ADO.NET(一)
- .NET学习之路(三)-------ADO.NET基础
- 黑马程序员之ADO.NET学习笔记:ADO.NET学习总结
- t-sql-ado.net学习ado.net
- ASP.NET 如何使用 SqlTransaction
- ado.net 学习
- ADO.NET学习笔记
- Modbus协议———常用功能码详解
- 欢迎使用CSDN-markdown编辑器
- 判断html中标签是否隐藏
- 如何让EditText具有自动大小写转换的功能。
- spring-session+redis解决session共存问题
- ADO.NET学习之SqlTransaction
- isight 9.0 过程集成、优化设计和稳健性设计的软件\
- AndroidStudio 第一次启动出现Unable to access android sdk add-on list
- 字符串哈希 Trie树 Watto and Mechanism : CodeForces
- http请求响应代码及其代表的错误含义
- 某些情况下使用context创建dialog时会报错的问题
- NKOJ-1017 搭建双塔
- HTML基本组成结构与标签
- Yii错误处理