- 什么是事务
- 事务的分类
- 事务的使用
- 使用存储过程执行事务
- EF6执行带事务的存储过程
- 使用事务的优缺点
- EF自带的事务
什么是事务
–事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,
–如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。
–为了确保要么执行,要么不执行,就可以使用事务。
–要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
事务的分类
显式事务:
每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。
隐式事务:
在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句显式完成。
批处理级事务:
只能应用于多个活动结果集 (MARS),在 MARS 会话中启动的 Transact-SQL 显式或隐式事务变为批处理级事务。当批处理完成时没有提交或回滚的批处理级事务自动由 SQL Server 进行回滚。
事务的使用
开始事务
begin transaction "事务名"
回滚事务
rollback transaction "事务名"
提交事务
commit transaction "事务名"
使用存储过程执行事务
## 示例 模拟银行转账功能
go
create proc cp_changeAcount
(
@idOut int, 打款人ID
@idIn int, 收款人ID
@Remain decimal(18,2) 转账金额
)
as
--定义变量记录错误数量
declare @error_nums int
set @error_nums=0
--开始事务
begin transaction tran_change
begin try
update [dbo].[Customers] set remaini=(remaini-@Remain) where id=@idOut
set @error_nums=@error_nums+@@error
update [dbo].[Customers] set remaini=(remaini+@Remain) where id=@idIn
set @error_nums=@error_nums+@@error
end try
begin catch
set @error_nums=@error_nums+1
print '错误异常:'+convert(varchar(50),error_number()) +'错误消息:'+error_message()
end catch
if(@error_nums>0)--表示有错,回滚
rollback transaction tran_change
else
commit transaction tran_change
go 执行存储过程
exec cp_changeAcount 4,5,2
切记:创建存储过程时不要同时执行存储过程,否则会报
超出了存储过程、函数、触发器或视图的最大嵌套层数(最大层数为 32)。错误
EF使用存储过程执行存储过程
后台显示的控制器
实例数据库对象
EnRoleEntities db = new EnRoleEntities();
public ActionResult Index()
{
var customer = db.Customers1.ToList();
return View(customer);
}
前台展示
@{
ViewBag.Title = "Index";
}
<form action="/Customer/Change_Remain">
<div>
<label>转出者</label>
<select name="idOut">
@foreach (var item in Model)
{
<option value="@item.ID" >@item.Name </option>
}
</select>
</div>
<div>
<label>转入者</label>
<select name="idIn">
@foreach (var item in Model)
{
<option value="@item.ID">@item.Name </option>
}
</select>
</div>
<div>
<label>金额</label>
<input type="text" name="Remain" />
</div>
<input type="submit" value="提交" />
</form>
<table class="table table-bordered" >
<thead>
<tr>
<th>编号</th>
<th>姓名</th>
<th>余额</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.remaini</td>
</tr>
}
</tbody>
</table>
提交的控制器
public ActionResult Change_Remain(int idOut,int idIn, decimal Remain)
{
try
{
db.cp_changeAcount(idOut, idIn, Remain);
}
catch (Exception)
{
return Content("错误");
}
//db.SaveChanges();
return RedirectToAction("Index");
}
事务的优缺点
事务优点
原子性、一致性、持久性通过数据库日志实现。
批处理数据库操作。
保证数据库级联操作的正确性。
事务缺点
执行较慢。
需要较多的磁盘空间保存事务日志。
执行更新需要内存较多。
EF6中的事务
可参考此博客:(https://www.cnblogs.com/pressforward/p/7601314.html)