코드에 사무제어 VS(데이터베이스 저장 프로세스 + 사무)를 추가하여 데이터의 완전성과 일치성을 확보하다
9380 단어 저장 프로세스
코드에서 사무 전제를 사용합니다: 같은 기능(또는 용례)이 같은 열린 데이터 연결에 있고 같은 사무에 놓여 조작되는 것을 반드시 보장해야 합니다.
우선 D층에 클래스를 추가합니다. 현재 동작의 연결을 저장하기 위해 하나의 사무에 실행하고, 사무 실행은 같은 연결을 열고, 사무가 끝나면 같은 연결을 닫는 공유 클래스입니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Maticsoft.DBUtility;
namespace PersonalFiles.DAL
{
public class DBTransaction
{
private DbHelperSQL SqlHelper = null;
public DBTransaction()
{
SqlHelper = new DbHelperSQL();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public SqlConnection GetConnection()
{
return SqlHelper.GetCon();
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public SqlTransaction GetTransaction(SqlConnection conn)
{
return conn.BeginTransaction();
}
/// <summary>
///
/// </summary>
public void Commit(SqlTransaction sqlTransaction)
{
sqlTransaction.Commit();
}
/// <summary>
///
/// </summary>
public void Rollback(SqlTransaction sqlTransaction)
{
sqlTransaction.Rollback();
}
/// <summary>
///
/// </summary>
public void Close(SqlConnection conn)
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
}
인터페이스 층의 백엔드 코드는 이전과 같이 직접 바꾸면 된다. 현재로서는 주로 B층의 코드에 큰 변화가 생겼기 때문에 하층에 업무를 전달하고 얻는 연결이 필요하다.
/// <summary>
///
/// </summary>
public void Add(PersonalFiles.Model.BasicInformation modelBasic, PersonalFiles.Model.T_HumanAgency model)
{
int flag = 0;
DBTransaction DbTran = new DBTransaction();
//
SqlConnection conn = DbTran.GetConnection();
//
SqlTransaction trans = DbTran.GetTransaction(conn);
try
{
//
//dalBasic.Add(modelBasic,conn,trans);
//
dalAgency.Add(model,conn,trans);
//
DbTran.Commit(trans);
//return true;
}
catch (Exception ex)
{
//
DbTran.Rollback(trans);
}
finally
{
DbTran.Close(conn);
}
}
주의해야 할 것은 D층으로 전달하는 것이다. 우리가 전달해야 할 것은 B층에서 얻은 동일한 연결이 열려 있는 하나의 업무이다.
/// <summary>
///
/// </summary>
public void Add(PersonalFiles.Model.T_HumanAgency model,SqlConnection conn,SqlTransaction trans)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("insert into T_HumanAgency(");
strSql.Append("myidentity,relation,receivemode,workingtime,intotime,oldworkplace,nowworkplace,inervice,registered,registeredcardid,registeredid,householder,isrecord,fileintotime,fileouttime,filetowhere,relationouttime,Paymentstandard,paymentsmonth,payments,stoptime,state,pri,admin,ID)");
strSql.Append(" values (");
strSql.Append("@myidentity,@relation,@receivemode,@workingtime,@intotime,@oldworkplace,@nowworkplace,@inervice,@registered,@registeredcardid,@registeredid,@householder,@isrecord,@fileintotime,@fileouttime,@filetowhere,@relationouttime,@Paymentstandard,@paymentsmonth,@payments,@stoptime,@state,@pri,@admin,@ID)");
SqlParameter[] parameters = {
new SqlParameter("@myidentity", SqlDbType.VarChar,50),
new SqlParameter("@relation", SqlDbType.VarChar,50),
new SqlParameter("@receivemode", SqlDbType.VarChar,50),
new SqlParameter("@workingtime", SqlDbType.VarChar,50),
new SqlParameter("@intotime", SqlDbType.VarChar,50),
new SqlParameter("@oldworkplace", SqlDbType.VarChar,50),
new SqlParameter("@nowworkplace", SqlDbType.VarChar,50),
new SqlParameter("@inervice", SqlDbType.VarChar,50),
new SqlParameter("@registered", SqlDbType.VarChar,50),
new SqlParameter("@registeredcardid", SqlDbType.VarChar,50),
new SqlParameter("@registeredid", SqlDbType.VarChar,50),
new SqlParameter("@householder", SqlDbType.VarChar,50),
new SqlParameter("@isrecord", SqlDbType.VarChar,50),
new SqlParameter("@fileintotime", SqlDbType.VarChar,50),
new SqlParameter("@fileouttime", SqlDbType.VarChar,50),
new SqlParameter("@filetowhere", SqlDbType.VarChar,50),
new SqlParameter("@relationouttime", SqlDbType.VarChar,50),
new SqlParameter("@Paymentstandard", SqlDbType.VarChar,50),
new SqlParameter("@paymentsmonth", SqlDbType.VarChar,50),
new SqlParameter("@payments", SqlDbType.VarChar,50),
new SqlParameter("@stoptime", SqlDbType.VarChar,50),
new SqlParameter("@state", SqlDbType.VarChar,50),
new SqlParameter("@admin", SqlDbType.VarChar,50),
new SqlParameter("@pri", SqlDbType.VarChar,50),
new SqlParameter("@ID", SqlDbType.VarChar,50)};
parameters[0].Value = model.myidentity;
parameters[1].Value = model.relation;
parameters[2].Value = model.receivemode;
parameters[3].Value = model.workingtime;
parameters[4].Value = model.intotime;
parameters[5].Value = model.oldworkplace;
parameters[6].Value = model.nowworkplace;
parameters[7].Value = model.inervice;
parameters[8].Value = model.registered;
parameters[9].Value = model.registeredcardid;
parameters[10].Value = model.registeredid;
parameters[11].Value = model.householder;
parameters[12].Value = model.isrecord;
parameters[13].Value = model.fileintotime;
parameters[14].Value = model.fileouttime;
parameters[15].Value = model.filetowhere;
parameters[16].Value = model.relationouttime;
parameters[17].Value = model.Paymentstandard;
parameters[18].Value = model.paymentsmonth;
parameters[19].Value = model.payments;
parameters[20].Value = model.stoptime;
parameters[21].Value = model.state;
parameters[22].Value = model.pri;
parameters[23].Value = model.admin;
parameters[24].Value = model.ID;
//DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);
DbHelperSQL.ExecuteSql(strSql.ToString(),conn,trans, parameters);
}
코드에 사무를 추가하는 것과 저장하는 과정에서 사무를 추가하는 것의 공통점과 차이점
공통점
1: 데이터의 일관성을 보장합니다.
차이점:
1. 코드에 사무를 추가하는 장점은 코드의 가독성과 유지보수성을 증가시켜 후기 유지보수 시스템이 코드를 한눈에 볼 수 있도록 편리하게 하고 데이터베이스에 저장 과정을 추가하는 가독성이 좋지 않다는 것이다.
2: 왜 데이터베이스가 자체로 가지고 있는 저장 프로세스 + 사무를 사용하는 것을 권장하지 않습니까?주로 하나의 프로젝트가 데이터베이스에 너무 많이 의존하기 때문에 후기의 데이터베이스 이전은 어느 정도 영향과 불편을 가져올 수 있다(sql에서oracle로 이전), 많은 전환은 호환성이 쉽지 않고 좋지 않다(앞으로 깊이 있게 공부한다).
3: 합작 개발 시 코드에 사무를 추가하면 코드 업로드의 원칙에 따라 여러분의 교류를 편리하게 할 수 있습니다.
트랜잭션을 사용하여 데이터베이스에 여러 테이블을 연결하여 정보를 쓸 수 있는 정확성과 일관성을 보장하는 이유는 다음과 같습니다.
사무의 원자성
사무의 원자성이란 사무에 포함된 프로그램이 데이터베이스의 논리적 작업 단위로서 데이터 변경 작업을 모두 실행하거나 모두 실행하지 않는 것을 말한다.이런 특성을 원자성이라고 부른다.사무의 원자성 요구는 하나의 사무를 하나의 프로그램으로 간주하면 완전하게 집행되거나 완전히 집행된다.사무의 조종 서열이 데이터베이스에 완전히 적용되거나 데이터베이스에 전혀 영향을 주지 않는다는 것이다.이러한 특성을 원칙성이라고 한다. 만약에 사용자가 하나의 업무 내에서 데이터베이스에 대한 업데이트를 완성했다면 이 때 모든 업데이트는 외부 세계에 보이거나 전혀 업데이트되지 않아야 한다.전자는 사무를 이미 제출했다고 하고, 후자는 사무를 철회한다고 한다.DBMS는 성공적으로 커밋된 트랜잭션에 의해 수행된 모든 작업이 데이터베이스에 완벽하게 반영되고 실패한 트랜잭션이 데이터베이스에 전혀 영향을 미치지 않는지 확인해야 합니다.
사무의 격리성
업무가 시작되었지만 업무를 제출하지 않았습니다. 데이터는 데이터베이스에 진정으로 쓰이지 않았습니다. 제가 인터럽트 테스트를 할 때 첫 번째 프로그램이 데이터베이스에 다 썼을 때 저는 데이터베이스를 찾아서 데이터베이스를 열 수 없고 찾을 수 없습니다. 연결 시간이 초과되었음을 알립니다. 업무의 격리성 때문에 데이터가 데이터베이스에 진정으로 쓰이지 않았습니다. 업무 제출을 해야 데이터베이스를 찾을 수 있습니다.같은 연결에서 실행되는 프로그램이 같은 업무 수행의 시작이 끝난 후에야 데이터베이스에 진정으로 쓰여진 것을 알 수 있다. 만약에 과정에서 업무 스크롤을 저장하면 데이터는 데이터베이스에 쓰이지 않는다.데이터의 일치성과 정확성을 보증하다.
데이터의 정확성과 일치성은 우리가 시시각각 고려해야 한다. 좋은 시스템은 반드시 비교적 좋은 정확성이 있어야만 사용자의 사용을 보장할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 호출 Oracle 스토리지 프로세스 상세 정보Java 호출 Oracle 스토리지 프로세스 상세 정보 단계: 1. Oracle 스토리지 프로세스 작성 2. 데이터베이스 작성 연결 도구 클래스 얻기 3. 간단한 응용 프로그램 호출 저장 프로세스 작성 구현: 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.