코드에 사무제어 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는 성공적으로 커밋된 트랜잭션에 의해 수행된 모든 작업이 데이터베이스에 완벽하게 반영되고 실패한 트랜잭션이 데이터베이스에 전혀 영향을 미치지 않는지 확인해야 합니다.
사무의 격리성
업무가 시작되었지만 업무를 제출하지 않았습니다. 데이터는 데이터베이스에 진정으로 쓰이지 않았습니다. 제가 인터럽트 테스트를 할 때 첫 번째 프로그램이 데이터베이스에 다 썼을 때 저는 데이터베이스를 찾아서 데이터베이스를 열 수 없고 찾을 수 없습니다. 연결 시간이 초과되었음을 알립니다. 업무의 격리성 때문에 데이터가 데이터베이스에 진정으로 쓰이지 않았습니다. 업무 제출을 해야 데이터베이스를 찾을 수 있습니다.같은 연결에서 실행되는 프로그램이 같은 업무 수행의 시작이 끝난 후에야 데이터베이스에 진정으로 쓰여진 것을 알 수 있다. 만약에 과정에서 업무 스크롤을 저장하면 데이터는 데이터베이스에 쓰이지 않는다.데이터의 일치성과 정확성을 보증하다.
데이터의 정확성과 일치성은 우리가 시시각각 고려해야 한다. 좋은 시스템은 반드시 비교적 좋은 정확성이 있어야만 사용자의 사용을 보장할 수 있다.
 

좋은 웹페이지 즐겨찾기