前言
用过数据库客户端操作的小伙伴都应该知道开始事务,提交事务等等这些操作,那么代码中怎么实现事务呢,往下看
认识事务
1、概念
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
2、应用场景
举个业务例子,小张要转账给小李100元,那么正常这时候数据库是不是要做两件事情,第一件是小张账号余额减100,第二件是小李账号增加100元。那假如小张在扣钱的这个过程中数据库因某些原因导致失败了,那么小李那边的账号操作就应该直接取消了。
实现事务操作
.net 实现事务的方式用很多种,发现这篇文章介绍得很全面,推荐大家看看《.NET CORE 数据库事务进化总结》
因为框架需要,我没有使用后面那些工作单元、AOP 事务等方式,我选择利用线程id这种方式,这种方式也个很明显的缺点,就是不支持异步编程。
具体代码
在BLL层新增一个事务的方法
SystemUserBLL.cs
/// <summary>
/// 更新用户(事务)
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public DXResult Update(SystemUser item)
{
DXResult dXResult = new DXResult();
try
{
//注意:Transaction不支持异步编程
_dal.fsql.Transaction(() =>
{
item.ModifyTime = DateTime.Now;
//更新用户表
dXResult.count = _dal.fsql.Update<SystemUser>().SetSource(item)
.IgnoreColumns(it => new { it.CreateTime })
.ExecuteAffrows();
//更新其他关联表
_dal.fsql.Ado.ExecuteNonQuery(string.Format("UPDATE TEST_USER SET ModifyTime=sysdate WHERE USERID='{0}'", item.Id));//这个表是没有创建的,用于异常跳出
if (dXResult.count < 1)
throw new Exception("数据修改失败");
dXResult.code = DXCode.Success;
dXResult.msg = "数据已修改";
});
}
catch (Exception ex)
{
dXResult.code = DXCode.Failure;
dXResult.msg = ex.Message;
}
return dXResult;
}
接口
ISystemUserBLL.cs
DXResult Update(SystemUser item);
UI层
[HttpPost("updateUser")]
public dynamic UpdateUser(SystemUser user)
{
var obj = _systemUserBLL.Update(user);
return obj;
}
开始测试
数据库现有两条数据
1、先注释掉这段代码,然后测试
//更新其他关联表
//_dal.fsql.Ado.ExecuteNonQuery(string.Format("UPDATE TEST_USER SET ModifyTime=sysdate WHERE USERID='{0}'", item.Id));//这个表是没有创建的,用于异常跳出
成功更新数据
2、测试异常情况
数据没有变化,是期望的效果,成功。
完整代码已上传码云:https://gitee.com/shao-jiayong/cuo-ding