數據庫事務
數據庫事務定義
事物:是有一系列的邏輯語句組成的工作單元,事物保證這一系列語句要么成功執行所有語句,要么都不執行。
數據庫事物語法
- 開啟事物
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();
}
}
不知觀點是否正確,歡迎其他觀點討論。