c# - 运行程序后数据库表被锁定
问题描述
我需要向TBL_LOAN_DETAILS
表中插入数据。当调用LoanDetails()
这些数据需要插入到表中的方法时,InTBL_LOAN_DETAILS
ID
是自动递增的。在将数据插入到之后,TBL_LOAN_DETAILS
我需要将该记录ID
作为参数传递给另一个称为CribProcess()
within 的方法LoanDetails()
。在这再次经过一些计算/逻辑之后,我需要更新TBL_LOAN_DETAILS
. 为了实现这一点,我使用了以下代码。(我无法在这里粘贴完整的代码,因为stackoverflow阻止了它,所以我使用pastebin)。我对该行程序设置了一个刹车点,该行 lAEntities.TBL_LOAN_DETAILS.Add(tBlLoanDetails);
程序不在此行之后运行。lAEntities.SaveChanges();
我的部分代码:请使用链接检查我的完整代码。
public LoanDetailEntityResponse LoanDetails(string custId, string facilityType, string applyedDate, string currency,string RequiredLoanAmount,string RepaymentPeriod,
string NIC,string CustName,string DateofBirth, string CommunicationAddress,string MobileNumber,string LoanPurpose,string Occupation,string NetIncome,string Expenses,string Education_qualification,
string TypeOfEmployment,string GE_Emp_Category,string Emp_Period,string GE_Position,string PE_Existence, string PE_Position,string SE_Experience,string SE_Business_Nature, string ValueOfAssets,
string SE_Bus_RegNoo_Availability, string SE_Maintain_Financial_Recode, List<LandPropertyAsset> AssetLandList, List<VehicleAsset> AssetVehicleList)
{
var refNo = string.Empty;
var response = new LoanDetailEntityResponse();
var lAEntities = new LAEntities();
DateTime appDate;
DateTime DOB;
using (var transaction = lAEntities.Database.BeginTransaction())
{
if (DateTime.TryParse(applyedDate, out appDate))
{
applyedDate = appDate.ToShortDateString();
if (DateTime.TryParse(DateofBirth, out DOB))
{
DateofBirth = DOB.ToShortDateString();
refNo = Common.GetSerialSequence("LOANREFERENCENO", transaction);
string approvalStatus = "";
int approvalId = 1;
decimal loanId = 0;
var tBlLoanDetails = new TBL_LOAN_DETAILS
{
CUSTID = custId,
REFNO = refNo,
FACILITY_TYPE = facilityType,
APPLIED_DATE = applyedDate,
CURRENCY = currency,
REQLOANAMOUNT = Convert.ToDecimal(RequiredLoanAmount),
REPAYMENTPERIOD = RepaymentPeriod,
NIC = NIC,
CUSTNAME = CustName,
DATEOFBIRTH = DateofBirth,
COMMUNICATIONADDRESS = CommunicationAddress,
MOBILENUMBER = MobileNumber,
PURPOSEOFLOAN = LoanPurpose,
OCCUPATION = Occupation,
NETINCOME = Convert.ToDecimal(NetIncome),
EXPENSES = Convert.ToDecimal(Expenses),
EDUCATION_QUALIFICATION = Education_qualification,
TYPEOFEMPLOYMENT = TypeOfEmployment,
GE_EMP_CATEGORY = Convert.ToInt32(GE_Emp_Category),
EMP_PERIOD = Convert.ToInt32(Emp_Period),
GE_POSITION = Convert.ToInt32(GE_Position),
PE_EXISTENCE = Convert.ToInt32(PE_Existence),
PE_POSITION = Convert.ToInt32(PE_Position),
SE_EXPERIENCE = Convert.ToInt32(SE_Experience),
SE_BUS_NATURE = Convert.ToInt32(SE_Business_Nature),
SE_BUS_REGNNO_AVAILABILITY = SE_Bus_RegNoo_Availability,
SE_MAINTAAIN_FINANTIAL_RECORD = SE_Maintain_Financial_Recode,
EMP_VALUEOFASSETS = Convert.ToInt32(ValueOfAssets),
LOAN_STATUS_ID = approvalId,
REPAYMENTSCORE = 0,
PROPOSED_LOAN_FACI_INSTA = 0,
EXSISTING_LOAN_FACI_INSTA = 0,
ODINTEREST = 0,
CREDITCARD = 0,
SURPLUS = 0,
LOAN_STATUS_DES = "",
ISACTIVE = 1,
CREATEDBY = "System",
CREATEDDATETIME = DateTime.Now,
MODIFIEDBY = "System",
MODIFIEDDATETIME = DateTime.Now
};
lAEntities.TBL_LOAN_DETAILS.Add(tBlLoanDetails);
lAEntities.SaveChanges();
//transaction.Commit();
var loanDetail = lAEntities.TBL_LOAN_DETAILS.FirstOrDefault(x => x.REFNO.Equals(refNo) && x.ISACTIVE == 1);
if (loanDetail != null)
{
loanId = loanDetail.ID;
// Call Crib process
AppSettingsReader configReader = new AppSettingsReader();
var chromeDriverUrl = (string)configReader.GetValue("ChromeDriverUrl", typeof(string));
var navigateUrl = (string)configReader.GetValue("CRIBNavigateUrl", typeof(string));
var userName = "";
var password = "";
CribAutoProcess ca = new CribAutoProcess();
int facilityID = int.Parse(loanId.ToString());
ca.CribProcess(navigateUrl, userName, password, facilityID, CustName, NIC, "Testing");
}
}
}
}
}
运行程序后,TBL_LOAN_DETAILS
表得到锁定,这意味着,当我尝试使用 oracle sql developer 删除表时,此 oracle 错误消息显示。
ORA-00054: 资源繁忙并使用指定的 NOWAIT 获取或超时已过期
解决方案
由于您正在使用事务,因此您需要执行 aCOMMIT
或ROLLBACK
. 如果您不这样做,您当前遇到的错误将会发生,因为无论您是否使用了using
关键字并且它已被处理,事务仍在使用该记录。
您可以做的删除锁是重新启动运行 oracle 的服务或终止 oracle 中持有锁的进程。之后,oracle 将执行自己的ROLLBACK
进程,并且锁将消失。
推荐阅读
- javascript - 如何在 PeerJs peer.call(id, stream, [options]) 函数中设置元数据?
- flutter - 如何在 Flutter 中手动计算布局
- sql-server - 在 SQL Server 中制作摘要报告
- python - 使用 python 或 node.js 将平面文件从 SFTP 上传到 S3
- google-sheets - 谷歌表格公式在创建新表格之前不起作用
- python-3.x - 如何合并单元格而不丢失 libreoffice-calc 中的数据?
- django - 为什么我的 websocket 在 Django Channels App 中不断断开连接?
- ios - 本机:未安装 InAppBrowser 或您正在浏览器上运行。回退到window.open。在 iOS 上
- c# - 如何使用 C#/.NET 使用多个“Where”表达式并将它们与 AND 和 OR 链接在一起?
- regex - 在 vb.net 中使用正则表达式