묻고 답해요
152만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결
테이블 락 원인 궁금
지금 제가 신입으로 와서 SM 하고 있는 서비스는 JSP + Spring4로 진행하고 있습니다.현재 테이블 락이 너무 자주 걸려서 (데드락) 계속 머리가 아픈 상황입니다.이게 왜 걸릴까에 대해서 한번 고민하고 있는데, 혹시 이 추측이 맞을까요 ? (폐쇄망이라 AI를 전혀 못 쓰는 상황입니다..)특정 서비스 (비즈니스 로직)마다 상단에ex.@Inject private SupplyEvaluationResultDao supplyEvaluationDao;이런 식으로 DI를 하고 있습니다.그리고@Autowired private DataSourceTransactionManager transactionManager;이렇게 트랜잭션 메니저를 DI한 후 데이터를 업데이트 하는 서비스에서는 (U, D).. 서비스마다DefaultTransactionDefination def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); Transaction status = transactionManager.getTransaction(status);이것들을 매번 선언하고모든 과정이 통과하면 transactionManager.commit(status);특정 과정 진행 중 오류가 발생하면 transactionManager.rollback(status); 를 하고 있습니다.근데 이게 SM이다 보니까, 여럿이서 개발을 진행해서 transactionManager.commit() 이나 transactionManager.rollback()을 안하고 Map 형태로 그냥 RES_CODE에 오류 코드, RES_MSG에 오류 메시지만 담아서 반환하는 경우가 있습니다.서비스 메서드 위에서는 TransactionStatus까지 그대로 적용은 하는데...resMap.put("RES_CODE", "0020"); resMap.put("RES_MSG", "파일은 금지된 형식입니다."); return resMap;트랜잭션 상태를 가져온 후 commit 이나 rollback 없이 그대로 Map을 반환해버린 경우 혹시 테이블 락이 발생하는 것일까요 ? 트랜잭션 상태를 끝맺음을 안 내서 테이블 락이 걸리는 것인지 가능성이 있는 것일지 궁금합니다 !
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
데드락 탐지에서 강의 극후반에 LLockStack 관련한 질문입니다!
안녕하세요.나중에 프로젝트 진행하실 땐 lock stack을 TLS로 관리해서 스레드마다 스레드 id가 관리되도록 하신다 말씀하셨습니다. 여기에서 생긴 궁금증입니다. 스레드 id가 부여될 때, 감소하지 않고 증가하는 nameToId().size()로 만들어지는 이상 모든 id가 고유할 거라고 생각합니다.id를 통해서 lockHistory에서 value(set객체)를 꺼냅니다. lockHistory는 TLS에서 관리되지 않는 전역 객체입니다(애초에 그러면 안 되겠죠. 전역적으로 사이클 여부를 탐지해야 하니까요!).스레드 id가 유일한 이상 lockStack을 TLS에서 관리하나 전역으로 관리하는 것이 차이가 없을 것 같은데, 강의 후반에 새로 영상을 추가하시어 '스레드마다 잡고 있는 락이 다르기 때문에 TLS로 관리해야 한다'고 말씀하신 이유가 궁금합니다!id가 전역적으로 1,2,3,4,5,6..이렇게 증가하거나 스레드 별 공간에서 {1,2..} {1,2...} {1,2...} 의 차이 정도로만 생각되어 어떤 본질적인 차이가 있는지 알고 싶습니다!p.s 수업에서 진행한 테스트 코드에서도 문제가 없었던 이유도 궁금증에 한몫을 했습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
데드락 어떻게 해결할 지 궁금합니다.
안녕하세요. Rookiss 강사님.덕분에 강의 아주 감사히 잘 들어가며 배우고 있습니다.다름이 아니라, 강의 중, 데드락 프로파일러를 이용하여, lock 간 사이클 여부를 확인하여사전에 어느 정도 사전에 예방 가능하지만 그래도 다 막을 수는 없다고 하셨는데,막상 발견된다면 데드락을 해결하는 것은 어렵지 않다고 알려주셨습니다. 혹시, 데드락 프로파일러를 통해 발견되지 않을 경우,데드락이 발생했는지 어떻게 확인하고, 데드락이 발견되면 어떻게 해결하는 지 궁금합니다. 스스로 생각하기로는 스핀락의 경우, 데드락이 발생하게 되면 뺑뺑이를 계속 돌게 될테니CPU가 증가하는 모습으로 나타날 것으로 보이려나 싶네요 혹여나 강의 중에 설명 주셨는데, 재질문 드리는 거라면 정말 죄송합니다.항상 좋은 강의 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업의 코드가 이해가 안되어서 질문드립니다.
Thread1이 TestUser에서 lock이 걸리고 public static void TestUser() { lock(_lock) <-- 요기 { Console.WriteLine("This is TestUser"); } } Thread2가 TestSession에서 lock이 걸리는 걸로 알고 있습니다. public static void TestSession() { lock(_lock) { Console.WriteLine("This is TestSession"); } } 근데 이렇게 해서 데드락이 걸린다는 게 잘 와닿지 않습니다. 수업시간에 2개의 자물쇠를 각각 다른 사람이 잠굴 때 데드락이 발생한다고 하셨는데 위 코드가 그것을 설명하는 내용인가요? TestUser에서 lock이 걸려도 lock안의 코드를 수행하고 나오고, TestSession에서도 lock안의 코드를 수행하고 나오면 되지 않나요? 서로 다른 쓰레드여도 작업하는 공간이 다를텐데 왜 둘다 lock에서 먹통이 되는지 잘 이해가 가지 않습니다.
주간 인기글
순위 정보를
불러오고 있어요