一、什么是事务?
事务是一系列操作的集合,这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的最小工作单元。
二、为什么需要事务?
事务包含了一组操作,这些操作可以是可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,这些操作就都不会执行,前面执行的操作也会回滚原状态,保证了数据的一致性和完整性。就像银行的转账,张三给李四转账,只有当张三账户的钱转走了,并且李四账户的钱收到了之后转账事务才能提交。否则,如果张三账户钱转走了,在李四还没收到钱之前忽然断电或者断网了,本次转账就不会成功。张三和李四账户的状态会回滚到转账前的状态,保证数据一致性,保证数据不会出错。
三、事务的四大特性:
1、原子性
整个事务要么全部成功提交要么全部失败回滚,就像上面的例子扣除张三的钱时突然宕机失败了全部操作撤销。
2、隔离性
一个事务在完成前对其他事务是不可见的,一个事务执行之前就代表上一个事务一定结束了。
3、一致性
事务操作前后,数据表中的数据不会发生变化,直至成功提交前。就像张三和李四转账,在转账成功之前,数据库中两者账户的钱是不变的。
4、持久性
一旦事务提交则会永久保存在数据库中。
四、事务类型:
(1)手动事务
手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。尽管此模型提供了对事务的标准控制,但它缺少一些内置于自动事务模型的简化操作。例如,在手动事务中数据存储区之间没有自动登记和协调。此外,与自动事务不同,手动事务中事务不在对象间流动。
如果选择手动控制分布式事务,则必须管理恢复、并发、安全性和完整性。也就是说,必须应用维护与事务处理关联的 ACID 属性所需的所有编程方法。
(2)自动事务
.NET 页、XML Web services方法或 .NET Framework 类一旦被标记为参与事务,它们将自动在事务范围内执行。您可以通过在页、XML Web services 方法或类中设置一个事务属性值来控制对象的事务行为。特性值反过来确定实例化对象的事务性行为。因此,根据声明特性值的不同,对象将自动参与现有事务或正在进行的事务,成为新事务的根或者根本不参与事务。声明事务属性的语法在 .NET Framework 类、.NET 页和 XML Web services 方法中稍有不同。
声明性事务特性指定对象如何参与事务,如何以编程方式被配置。尽管此声明性级别表示事务的逻辑,但它是一个已从物理事务中移除的步骤。物理事务在事务性对象访问数据库或消息队列这样的数据资源时发生。与对象关联的事务自动流向合适的资源管理器,诸如 OLE DB、开放式数据库连接 (ODBC) 或 ActiveX 数据对象 (ADO) 的关联驱动程序在对象的上下文中查找事务,并通过分布式事务处理协调器 (DTC) 在此事务中登记。整个物理事务自动发生。