SQL Server事务

孤街浪徒 提交于 2020-08-10 05:29:24
  1. 什么是事务
  2. 事务的分类
  3. 事务的使用
  4. 使用存储过程执行事务
  5. EF6执行带事务的存储过程
  6. 使用事务的优缺点
  7. 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)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!