рд▓реЗрдирджреЗрди рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА (рд╕рдмрд╕реЗ рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд):

public void Start() { using (var transactionScope = new TransactionScope()) { ... GetOrCreateCompany(someValue); ... transactionScope.Complete(); } } private Company GetOrCreateCompany(string companyName) { var company = _companiesRepository.GetCompany(companyName); //     ;     -  null if (company == null) company = _companiesRepository.Add(companyName); return company; } 


рдЗрд╕ рдХреЛрдб рдХреЛ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЕрдкрдирд╛ рд▓реЗрдирджреЗрди рдерд╛)ред

рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рд╕рд░рд▓ рдХреЛрдб рдореЗрдВ рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред



рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ: рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдбрд╛рд▓реЗрдВ, рд▓реЗрдирджреЗрди рдХреЛ рдПрдХ рд▓реВрдк рдореЗрдВ рд░рдЦреЗрдВ, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рдпрджрд┐ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкрд╛рд░ рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рддрд╛рд▓реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд╣реБрдд рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдХрд╣рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред

рдиреАрдЪреЗ рдореЗрд░реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдХреЛрдб рд╣реИ (рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд▓реЗрдирджреЗрди рдФрд░ рддрд╛рд▓реЛрдВ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ MySQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛):

 public void Start() { using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires, new TransactionOptions() { IsolationLevel = IsolationLevel.Serializable })) { ... GetOrCreateCompany(someValue); ... transactionScope.Complete(); } } private Company GetOrCreateCompany(string companyName) { var company = _companiesRepository.GetCompanyWithWriteLock(companyName); //    SELECT ... FOR UPDATE if (company == null) company = _companiesRepository.Add(companyName); return company; } 


рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рдХрдВрдкрдиреА рдХреЗ рдЪрдпрди рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд░реЗрдВрдЬ (рд╕реАрд░рд┐рдпрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг) рдХреЗ рд╕рд╛рде рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдХрдорд┐рдЯ рдХреЗ рдмрд╛рдж рдЕрдирд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рд▓реЗрдирджреЗрди, рдЬреЛ рдЙрд╕реА рдХрдВрдкрдиреА рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдЕрд╡рд░реБрджреНрдз рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо Amdahl рдХреЗ рдирд┐рдпрдо рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ, рдлрд┐рд░ Amdahl рдХреЗ рдирд┐рдпрдо рдкрд░ - рдФрд░ рдпрд╣ рджреБрдЦрдж рд╣реИ: рди рдХреЗрд╡рд▓ рд╣рдореЗрдВ рд▓реЗрдирджреЗрди рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рддрдХ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ (рдФрд░ рд▓реЙрдХ / рд▓реЙрдХ рдХреЗ рдиреАрдЪреЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рддрдп рдирд╣реАрдВ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╕реЗрдЯ-рд▓реЙрдХ рд╕реЗрдЯ рдХрд░реЗрдВ рднрд▓реЗ рд╣реА рдЪрдпрди рд╡рд╛рдВрдЫрд┐рдд рдХрдВрдкрдиреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдпрджрд┐ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЗрд╕ рдирд┐рд░реНрдгрдп рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рджреВрд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдо рдЕрднреА рднреА рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░реЗрдВрдЧреЗред

рдХрдВрдкрдиреА рдХрд╛ рдЪрдпрди рджреЛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
  1. рдХрдВрдкрдиреА рдХреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдирджреЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реБрд░реВ рд╣реЛ рдЪреБрдХрд╛ рд╣реИред
  2. рдХрдВрдкрдиреА рдХреЛ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛
рдЖрдЗрдП рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдФрд░ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдореМрдЬреВрджрд╛ рд▓реЗрдирджреЗрди рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдП рдЧрдП рд▓реЗрдирджреЗрди рдХреЗ рдмреАрдЪ рдХреЛрдИ рдбреЗрдЯрд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдирд╛ рд╣реИ:

 private Company GetOrCreateCompany(string companyName) { Company company; //    ,  ,       .   -    ,      using (var independentTransactionScope = new TransactionScope(TransactionScopeOption.Suppress)) { company = _companiesRepository.GetCompany(companyName); } //      ,        -     if (company != null) return; //company   null   : 1.      ,        2.      var company = _companiesRepository.GetCompanyWithWriteLock(companyName); if (company == null) //       -       company = _companiesRepository.Add(companyName); } } 


рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдорд╛рдЗрдирд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЪрдпрди рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдорд╛рди рд╡рд░реНрддрдорд╛рди рд▓реЗрдирджреЗрди рдХреЗ рдмрд╛рд╣рд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣реЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрди-рджреЗрди рдХреЗ рдЕрдВрджрд░ рдЕрдВрджрд░ рдЪрдпрди рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд▓рд╛рдн рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл, рдЖрдк рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдирдореВрдиреЗ рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдпрд╣ рд▓реЗрдЦ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЧрд▓рдд рджрд┐рд╢рд╛ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ: рд╕рдорд╕реНрдпрд╛ рддреБрдЪреНрдЫ рд╣реИ, рдФрд░ рд╕рдорд╛рдзрд╛рди ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓реЗ, рдФрд░ рдпрд╣ рдореБрдЭреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдкрд╣реЗрд▓реА рд▓рдЧрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдХреЗ рдпрд╛ рдЦрджрд╛рди рд╕реЗ рд╕рд╣рдордд рд╣реЛрдХрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВрдЧреЗред

рдЕрджреНрдпрддрди
рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрддреНрд░рд╛рдЪрд╛рд░ рдореЗрдВ, рд╢рджреАрдХреНрд╕ рд╣реИрдмрд░рдореИрди (рд╕рдорд╡рд░реНрддреА, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА) рдиреЗ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ - рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдореЗрдВ рди рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЬреЛрдбрд╝рдирд╛ рднреАред рдпрд╣, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╢реЛрдзрди рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 public class TransactionCode { private static readonly object _lockObject = new object(); public void Start() { using (var transactionScope = new TransactionScope()) { ... GetOrCreateCompany(someValue); ... transactionScope.Complete(); } } private Company GetOrCreateCompany(string companyName) { Company company; //,        using (var indepdentTransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew)) { var company = _companiesRepository.GetCompany(companyName); } if (company != null) return; //   ,     //    using (var independentTransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew)) { var company = _companiesRepository.GetCompanyWithWriteLock(companyName); if (company == null) company = _companiesRepository.Add(companyName); independentTransactionScope.Complete(); } } } 


рдЕрдм рд╣рдо рдХрдВрдкрдиреА рдХреЛ рдореБрдЦреНрдп рд▓реЗрдирджреЗрди рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬреЛрдбрд╝ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рддреБрд░рдВрдд рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ, рддреБрд░рдВрдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдореВрд▓реНрдп (рдФрд░ рдореБрдЦреНрдп рд▓реЗрдирджреЗрди рдХреЗ рдмрд╛рдж рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╣реИ) рдЕрдиреНрдп рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрд╕реЗ, рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИ: рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡реГрджреНрдзрд┐ 300% рдереА (рдФрд░ рдбреЗрдЯрд╛ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдЧрддрд┐рд╢реАрд▓ рд╣реЛрдЧрд╛, рдЫреЛрдЯреЗ рд▓реЙрдХ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рдХрд╛рд░рдг рд╡реГрджреНрдзрд┐ рдЕрдзрд┐рдХ рд╣реЛрдЧреА)ред
рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:
1. рдореБрдЦреНрдп рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдореБрдЦреНрдп рд▓реЗрди-рджреЗрди рд╡рд╛рдкрд╕ рд▓реБрдврд╝рдХрд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рд╕реНрд╡рддрдВрддреНрд░ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рдордиреЗ рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИ)ред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рджреЛрд╖ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ... рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдирд╣реАрдВ: GetOrCreate рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрд╡рддрдВрддреНрд░ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рдЬреЛ рдЕрднреА рднреА рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛: рдЗрд╕ рд▓реЗрдирджреЗрди рдореЗрдВ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реЗ рдПрдХ рдореЗрдВред
2. рдореЗрд░реЗ рдкрд╛рд╕ TransactionScopeOption.RequiresNew рдФрд░ TransactionScopeOption.Suppress рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рд▓реЗрди-рджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИрдВ (рдореИрдВ рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╡рд░ рдХрд░реВрдВрдЧрд╛)ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореБрдЭреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ - рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВред

Source: https://habr.com/ru/post/In115156/


All Articles