事务
程序员文章站
2022-03-05 09:57:20
...
简介
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
概要
一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:
- 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
但在现实情况下,失败的风险很高。在一个数据库事务的执行过程中,有可能会遇上事务操作失败、数据库系统/操作系统失败,甚至是存储介质失败等情况。这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。
ACID性质
主条目:ACID
并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。
• 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
• 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
• 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
• 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。
要用到事务要先引用(using System.Transactions;)
ReturnJsonVo是一个实体类,里面是返回的状态state,文本text,状态码code,附加数据object
按正常来说,程序的流程一般是不会出错的,要么就是要BUG,如果一个流程只走到一半就结束了,那么就是有缺陷的,事务就很好解决这个,要么整个流程成功走完,要么就全部失败
public ActionResult InsertUserType(SYS_UserType fmUserType, string modularDetailIds)
{
ReturnJsonVo returnJson = new ReturnJsonVo();
//使用事务--开启事务
using (var scope = new TransactionScope())
{
try
{
//===新增UserType
fmUserType.ToVoidNo = true;//默认启用该角色
fmUserType.FoundTime = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");//添加时间
myModel.SYS_UserType.Add(fmUserType);
myModel.SaveChanges();
//====获得新增的新增UserTypeid
int userTypeId = fmUserType.UserTypeID;
//===新增权限
//分割modularDetailIds "1,2,3"
string[] strings = modularDetailIds.Split(',');
//遍历 新增权限
List<PW_Jurisdiction> listJurisdiction = new List<PW_Jurisdiction>();
foreach (string s in strings)
{
if (!string.IsNullOrEmpty(s))
{
PW_Jurisdiction jurisdiction = new PW_Jurisdiction
{
UserTypeID = userTypeId,
ModularDetailID = Convert.ToInt32(s)
};
listJurisdiction.Add(jurisdiction);
}
}
//添加多条数据
myModel.PW_Jurisdiction.AddRange(listJurisdiction);
myModel.SaveChanges();
//====提交事务!!!!
scope.Complete();
returnJson.State = true;
returnJson.Text = "保存成功";
}
catch (Exception ex)
{
Console.Write(ex);
returnJson.State = false;
returnJson.Text = "保存失败";
}
}
return Json(returnJson, JsonRequestBehavior.AllowGet);
}
上一篇: 国内自动驾驶公司争先入局Robotaxi
下一篇: 解码方法