数据库之事务

四大属性:原子性、一致性、隔离性、持久性(ACID)

原子性:事务必须是原子工作单元;对于其数据修改,要么全部执行,要么全都不执行。

一致性:事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,
以保持所有数据的完整性,在事务结束时,所有的内部数据结构都必须是正确的。

隔离性:由并发事务所做的修改必须与任何其他事务所做的修改隔离。
事务识别数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是第二个事务修改它之后的状态,事务不会识别中间状态的数据。
这为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。

持久性:完成完全持久的事务之后,它的影响将永久存在于系统中。该修改即使出现系统故障也将一直保持。SQL Server2014和更高的版本将启用延迟的持久性事务。
提交延迟的持久事务后,该事务日志记录将保留在磁盘上。

SQL程序猿要负责启动和结束事务,同时强制保持数据的逻辑一致性。程序猿必须定义数据修改的顺序,使数据相对于其组织的业务规则保持一致。
程序猿将这些修改语句包括到一个事务中,使SQL Server数据库引擎能够强制该事务的物理完整性。

启动事务
使用API函数和Transact-SQL语句,可以在SQL Server数据库引擎实例中将事务作为显示、自动提交或隐式事务来启动

显示事务
通过API函数或发出Transact-SQL begin transaction、commit transaction、commit work、rollback transaction或者rollback work Transact-SQL语句明确定义事务的开始和结束。
当事务结束时,连接将返回到启动显示事务前所处的事务模式,或者隐式模式,或者自动提交模式。

自动提交事务
SQL Server数据库引擎的默认事务管理模式。每个Transact-SQL语句在完成时,都被提交或者回滚。如果一个语句成功完成,则提交该语句;如果遇到错误,则回滚该语句。
只要没有显示事务或者隐式事务覆盖自动提交模式,与SQL Server数据库引擎实例的连接就以此默认模式操作。

隐式事务
当连接以隐式事务模式进行操作时,SQL Server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。无需描述事务的开始,只需提交或回滚没个事务。隐性事务模式生成连续的事务链。
通过API函数或Transact-SQL set implicit_transaction on 语句,将隐性事务模式设置为打开。此模式也成为Autocommit off.

批处理级事务
只能应用于多个活动结果集(MARS),在MARS会话中启动的Transact-SQL显示或者隐式事务变为批处理级事务。当批处理完成时没有提交或回滚的批处理级事务自动由SQL Server进行回滚

分布式事务
分布式事务跨越两个或多个称为资源管理器的服务器。称为事务管理器的服务器组件必须在资源管理器之间协调事务管理。

跨越两个或多个数据库的单个SQL Server数据库引擎实例中的事务实际上是分布式事务。该实例对分布式事务进行内部管理;对用户而言,其操作就像本地事务一样。

对于应用程序而言,管理分布式事务就像管理本地事务。当事务结束时,应用程序会请求提交或回滚事务。
不同的是,分布式提交必须由事务管理器管理,以尽量避免出现因为网络故障而导致事务由某些资源管理器成功提交,但由另一些资源管理器回滚的情况。
通常分为两个阶段(准备阶段和提交阶段)管理提交进程可避免这种情况,这称为两阶段提交(2PC)

准备阶段
当事务管理器收到提交请求时,它会向该事务涉及的所有资源管理器发送准备命令。然后,每个资源管理器将尽力使该事务持久,并且所有保存该事务日志映像的缓冲区将被刷新到磁盘中。
当每个资源管理器完成准备阶段时,它会向事务管理器返回准备成功或准备失败的消息。

提交阶段
如果事务管理器从所有资源管理器收到准备成功的消息,它将向每个资源管理器发送一个提交命令。然后,资源管理器就可以完成提交。
如果所有资源管理器都报告提交成功,那么事务管理器就会向应用程序发送一个成功通知。
如果任一资源管理器报告准备失败,那么事务管理器将向每个资源管理器发送一个回滚命令,并向应用程序表明提交失败。

结束事务
使用commit或者rollback语句,或者通过相应的API函数结束事务。

commit
如果事务成功,则提交。commit语句保证事务的所有修改在数据库中都永久有效。commit语句还释放事务使用的资源,例如:锁

rollback
如果事务出现错误,或用户决定取消事务,则回滚事务。rollback语句通过将数据返回它在事务开始时所处的状态,来取消事务中所有的修改。rollback也释放事务所占用的资源。

原文地址:https://www.cnblogs.com/Java-125/p/12857177.html