首先什么是事务
事务指数据操作的最小逻辑单元。一个事务要么完成,要么不完成,不存在粒度更小的数据操作。
在关系型数据中,当没有使用“begin transaction”显式的定义一个事务时,一条SQL语句默认就是一个transaction。例如:
insert into my_table_1
select *
from my_table_2
这条语句就是一个transaction。my_table_2中的所有数据都会被插入到my_table_1中,要么操作失败一条都没有插入,要么全部插入,不存在其他可能性。
需要注意的是SQL Server是隐式提交事务的,即运行一条DML会直接提交到数据库,不需要显式指定Commit关键字。但Oracle则不会自动提交DML,除非遇到一条Commit或Rollback语句。在上例中,如果插入了一半后发生了某种错误,Oracle将回滚已插入的那部分数据,这称为statement-level rollback,且回滚后事务挂起,等待用户的进一步指令。
在SQL Server中,一个存储过程或函数中包含多个SQL语句,且没有显式指定事务时,多条SQL语句默认不在一个transaction里。即可能出现一个存储过程中的前半部分SQL执行成功,但后面的SQL没有执行的情况。
如果显式的使用“begin transaction”定义了transaction,则被包含到语句里的多条SQL属于一个transaction。
另外在SQL Server中,使用Savepoint可以有条件的回滚部分事务。虽然这样做破坏了事务的基本含义,但由于通常回滚操作的代价很高,因此部分回滚事务