해당 사이트 또는 여기에서 찾을 수없는 것 같습니다. 대답은 '예'입니다. 특히 고유 키 위반을 검사하는 Verifier를 작성하려고합니다 (격리 수준을 Serializable로 올려야 함을 알고 있습니다). Verifier가 저장과 동일한 트랜잭션에서 실행되지 않는 한이 작업은 작동하지 않습니다.DevForce에서 유효성 검사 및 저장을 위해 동일한 트랜잭션을 사용합니까
1
A
답변
1
DevForce는 유효성 검사 및 저장 프로세스에 동일한 트랜잭션을 사용하지 않습니다. EntityServerSaveInterceptor 컨텍스트 내에서 권한 부여 및 유효성 검사가 수행 된 다음 실제 저장을 수행 할 때 TransactionScope가 열립니다. 검증 자 내에서 쿼리를 수행하면 별도의 TransactionScope가 사용됩니다.
사용자 지정 EntityServerSaveInterceptor에서 약간의 추가 작업을 수행하면이 문제를 해결할 수 있습니다. ValidateSave 함수를 재정 의하여 유효성 검사를 무시한 다음 ExecuteSave 메서드를 재정 의하여 TransactionScope를 연 다음 기본 저장 논리를 호출하기 전에 유효성 검사 논리를 수행합니다. 저장 중에 DF에 의해 열리는 TransactionScope는 TransactionScope에 등록됩니다. 이런 식으로 뭔가 :
public class EntityServerSaveManager : EntityServerSaveInterceptor {
protected override bool ValidateSave() {
// will do validation later
return true;
}
protected override bool ExecuteSave() {
using (var ts = new TransactionScope(TransactionScopeOption.Required, this.SaveOptions.TransactionSettings.ToTransactionOptions())) {
// Do validation logic now
...
// Now do save
base.ExecuteSave();
ts.Complete();
}
}
}
그래서 '지금 유효성 검사 논리를 수행합니다'의 일환으로, 내 사용자 지정 유효성 검사를 수행 한 후, 나는 base.ValidateSave를 부를 것이다()? UniqueVerifier를 작성하면 'Validation logic now'가 base.ValidateSave()에 대한 호출일까요? – jbiddle
인스턴스 검증자는 base.ValidateSave에 의해 자동으로 호출되므로 TransactionScope 내에서 base.ValidateSave를 호출하면됩니다. –
이것을 시도하면 다음 예외가 발생합니다. TransactionScope에 지정된 트랜잭션이 범위에 대해 요청 된 값과 다른 IsolationLevel을가집니다. 클라이언트와 서버 모두에서 모든 엔티티 관리자에 대해 DefaultSaveOptions를 설정하는 방법. 그게 중요하다면 나는 칵테일을 사용하고있다. – jbiddle