数据库事务
数据库事务定义
事物:是有一系列的逻辑语句组成的工作单元,事物保证这一系列语句要么成功执行所有语句,要么都不执行。
数据库事物语法
- 开启事物
begin transaction
- 结束事物
- 提交事物:事物执行成功的时候
commit
提交事物 - 事物回滚:事物执行失败时
rollback
回滚到事物执行前或事物所设置的某个保存点
例子
创建学生表
CREATE TABLE [dbo].[Student](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Number] [nvarchar](50) NULL,
[Name] [nchar](10) NULL,
[Age] [int] NULL
)
事物插入两条数据,第二条为非法数据。执行结果两条数据都未插入。执行语句
declare @ErrorCount int =0;
begin transaction
insert into Student([Number] ,[Name],[Age])values('0521','jerry',5);
set @ErrorCount = @ErrorCount + @@ERROR
insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello');
set @ErrorCount = @ErrorCount + @@ERROR
if @ErrorCount=0
begin
commit
end
else
begin
rollback
end
事物简单写法
一大部分书籍或博客都是如上写事物,执行成功commit
失败rollback
。其感觉好没有必要(认为在没有设回滚点时,
没必要用rollback
),事务已经保证了逻辑单元,之前提交同样可以。
begin transaction
insert into Student([Number] ,[Name],[Age])values('0521','jerry',5);
insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello');
commit
ADO.Net中应用
在ado.net 中感觉完全没有必要通过try{}catch(){}
事物回滚。
var conn = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;
string SQL1 = "insert into Student([Number] ,[Name],[Age])values('0521','jerry',5) ";
string SQL2 = "insert into Student([Number] ,[Name],[Age])values('0521','jerry','hello')";
using (SqlConnection connection = new SqlConnection(conn))
{
connection.Open();
SqlTransaction sqlTran = connection.BeginTransaction();
SqlCommand command = connection.CreateCommand();
command.Transaction = sqlTran;
try
{
command.CommandText = SQL1;
int rowsAffected = command.ExecuteNonQuery();
command.CommandText = SQL2;
rowsAffected += command.ExecuteNonQuery();
transaction.Commit();
}
catch (Exception ex1)
{
//认为没有必要写Rollback
//transaction.Rollback();
}
}
不知观点是否正确,欢迎其他观点讨论。