제다이 거래
JDBC를 사용하여 MySQL에 연결하면 SQL 문을 실행하기 전에 트랜잭션을 시작해야합니다. MyBatis에서는 SQL 실행, 쿼리 및 기타 작업을 수행하기 위해 Session Transaction Object를 얻기 위해 OpenSession ()을 사용해야합니다. 데이터베이스에서의 작업이 끝나면 트랜잭션 객체는 데이터베이스 연결을 닫을 책임이 있습니다.
트랜잭션 객체는 다양한 데이터베이스 작업을 관리하고 수행하는 데 사용됩니다. 데이터베이스 연결을 켜고 닫고 SQL 문을 실행하며 오류 작업을 롤백 할 수 있습니다.
우리의 Redis에는 트랜잭션 관리 객체도 있으며 Redis.clients.jedis.Transaction에 위치합니다.
제다이 거래 관련 코드 :
패키지 cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.Transaction; Public Class Test7 {public static void main (String [] args) {Jedis Jedis = New Jedis ( "192.168.248.129", 6379); 트랜잭션 트랜잭션 = jedis.multi (); // 트랜잭션 제어 객체를 반환 // 미리 트랜잭션에서 실행할 작업을 사전로드 트랜잭션 ( "K4", "V4"); transaction.set ( "k5", "v5"); transaction.exec (); // execute}}Redis를 확인해 봅시다 :
데이터가 추가되었음을 발견했습니다
K4의 값과 k5의 값을 "v44"및 "v55"로 변경 한 다음 Transaction.Exec () 문의 트랜잭션을 추가합니다.
패키지 cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.Transaction; Public Class Test7 {public static void main (String [] args) {Jedis Jedis = New Jedis ( "192.168.248.129", 6379); 트랜잭션 트랜잭션 = jedis.multi (); // 트랜잭션 제어 객체를 반환 // 미리 거래 객체에서 실행할 작업을 사전 트랜잭션 ( "K4", "v44"); transaction.set ( "k5", "v55"); transaction.discard (); // 롤링}}}데이터 삽입 작업이 롤백되고 Redis의 두 값이 변경되지 않았 음을 알 수 있습니다.
Redis Transactions를 사용하여 일부 논리를 처리하여 신용 카드를 한 번 스 와이프하는 거래를 시뮬레이션합니다.
패키지 cn.com.redis; import redis.clients.jedis.jedis; import redis.clients.jedis.Transaction; 공개 클래스 testtransaction {// 신용 카드 소비 시뮬레이션 및 상환 공개 정적 무효 기본 (String [] args) {testTransaction t = new TestTransaction (); 부울 retvalue = t.transmethod (100); if (retvalue) {System.out.println ( "신용 카드 소비의 성공적인 사용!"); } else {System.out.println ( "신용 카드 소비 사용 실패!"); }} /*** Layman의 용어에서 Watch 명령은 키를 표시하는 것입니다. 키가 표시되면 * 거래를 제출하기 전에 다른 사람이 키를 수정하면 거래가 실패합니다. 이 상황은 일반적으로 프로그램에서 다시 시도 할 수 있습니다*. * * 먼저, 균형을 마시고 잔액이 충분한 지 확인하십시오. 불충분 한 경우 공제없이 마크를 취소하십시오. * 충분하면 업데이트 작업을 위해 트랜잭션을 시작하십시오. *이 기간 동안 키 잔액을 다른 사람에 의해 수정하면 트랜잭션 (EXEC)을 제출할 때 오류 가보고됩니다. *이 유형의 오류는 일반적으로 프로그램에서 잡힌 다음 성공할 때까지 다시 실행할 수 있습니다. * */ private boolean transmethod (int ems Jedis Jedis = New Jedis ( "192.168.248.129", 6379); int balance = 1000; // 사용 가능한 잔액 int 부채; // int amttoSubtract = 금액; // 실제 브러싱 금액 jedis.set ( "balance", string.valueof (balance)); Jedis.Watch ( "밸런스"); //jedis.set("Balance ","1100 "); //이 문장은 나타나지 않아야합니다. 다른 프로그램을 시뮬레이션하기 위해 항목이 수정되었습니다. 밸런스 = integer.parseint (jedis.get ( "balance")); if (balance <amttosubtract) {// 사용 가능한 잔액은 실제 브러시 금액보다 적으며 거래는 jedis.unwatch ()를 거부합니다. System.out.println ( "사용 가능한 잔액은 충분하지 않습니다!"); 거짓을 반환합니다. } else {// 사용 가능한 잔액이 충분하면 공제 작업 시스템을 실행합니다. 거래 거래 = jedis.multi (); Transaction.decrby ( "Balance", AmttoSubtract); // 균형 균형 AMTTOSUBTRATION TRANSACTION.INCRBY ( "부채", AMTTOSUBTRATION); // 신용 카드 부채는 AMTTOSUBTRATION TRATACT.EXEC (); // EXECUTE TRANSACTION BALAND = Integer.parseint (Jedis.get.get ( "Balance"))의 금액을 증가시킵니다. 부채 = integer.parseint (jedis.get ( "부채")); System.out.println ( "채무 거래 거래 실행 종료 ..."); System.out.println ( "사용 가능한 잔액 :"+밸런스); System.out.println ( "현재 돈 빚진 돈 :"+부채); 진실을 반환하십시오. }}}이 코드는 신용 카드를 사용한 사용자가 100 위안을 스 와이프하는 사용자를 시뮬레이션합니다. 현재 신용 카드의 가용 잔액은 100 위안으로 줄여야하며 100 위안의 부채를 늘려야합니다.
실행 결과 :
Redis 결과 :
우리의 운영이 성공했음을 증명하십시오.
트랜잭션 실행 중에 다른 운영이 트랜잭션을 방해하거나 거래의 계산 결과에 영향을 미치는 것을 방지하기 위해 Watch 명령이 추가되어 "Illusion Reading"및 "Dirty Data"와 같은 비정상적인 상황을 초래합니다. Watch 명령은 키를 만듭니다. 실행 중에 다른 사람이 키를 수정 한 것으로 밝혀지면 트랜잭션이 실패합니다. 이 유형의 오류는 일반적으로 프로그램에 걸렸다가 성공할 때까지 다시 실행할 수 있습니다. 따라서 Watch 명령은 데이터의 동기화를 보장 할 수 있습니다.
Watch 명령의 목적을 증명하기 위해 Jedis.set ( "Balance", "1100")을 공개합니다. 위의 코드에서 주석은 트랜스 메드 메소드가 중단 된 예외를 던집니다. 중단 된 예외를 던지고, 기본 메소드는 중단 된 예외를 포착 한 다음 해당 경고 상자가 나타납니다.
패키지 cn.com.redis; Java.util.list 가져 오기; import redis.clients.jedis.jedis; import redis.clients.jedis.Transaction; 공개 클래스 testtransaction {// 신용 카드 소비 시뮬레이션 및 상환 공개 정적 무효 기본 (String [] args) {testTransaction t = new TestTransaction (); 부울 retvalue = false; 부울 중단 = 거짓; try {retvalue = t.transmethod (100); } catch (InterruptedException e) {Interrupted = true; System.out.println ( "트랜잭션이 중단됩니다. 다시 실행하십시오!"); } 마침내 {if (retValue) {System.out.println ( "신용 카드의 성공적인 사용!"); } else {if (! Interrupted) {System.out.println ( "신용 카드 사용 실패! 불충분 한 잔액!"); }}}}} /*** 간단히 말하면, 시계 명령은 키를 표시하는 것입니다. 키가 표시되면 * 거래를 제출하기 전에 다른 사람이 키를 수정하면 거래가 실패합니다. 이 상황은 일반적으로 프로그램에서 다시 시도 할 수 있습니다*. * * 먼저, 균형을 마시고 잔액이 충분한 지 확인하십시오. 불충분 한 경우 공제없이 마크를 취소하십시오. * 충분하면 업데이트 작업을 위해 트랜잭션을 시작하십시오. *이 기간 동안 키 잔액을 다른 사람에 의해 수정하면 트랜잭션 (EXEC)을 제출할 때 오류 가보고됩니다. *이 유형의 오류는 일반적으로 프로그램에서 잡힌 다음 성공할 때까지 다시 실행할 수 있습니다. * */ private boolean transmethod (int 금액)는 InterruptedException {system.out.println ( "신용 카드를 사용하여 선불 지불"+금액+"yuan"); Jedis Jedis = New Jedis ( "192.168.248.129", 6379); int balance = 1000; // 사용 가능한 잔액 int 부채; // 절대 금액 int amttosubtract = 금액; // 실제 브러시 제한 jedis.set ( "밸런스", String.valueof (balance)); Jedis.Watch ( "밸런스"); jedis.set ( "balance", "1100"); //이 문장은 나타나지 않아야합니다. 다른 프로그램을 시뮬레이션하기 위해 항목이 수정되었습니다. 밸런스 = integer.parseint (jedis.get ( "balance")); if (balance <amttosubtract) {// 사용 가능한 잔액은 실제 브러시 금액보다 적으며 거래는 jedis.unwatch ()를 거부합니다. System.out.println ( "사용 가능한 잔액은 충분하지 않습니다!"); 거짓을 반환합니다. } else {// 사용 가능한 잔액이 충분하면 공제 작업 시스템을 실행합니다. 거래 거래 = jedis.multi (); transaction.decrby ( "Balance", AmttoSubtract); // 잔액은 AmttoSubtract Transaction.incrby ( "부채", amttoSubtract)의 돈을 뺀 잔고 <cound <boodbract 목록 <botorction <object> result = transaction.exec (); // ratuction submistion, transal indation) 실행 시스템 중에 수정되었습니다. out.println ( "트랜잭션 실행 인터럽트 공제 ..."); 새로운 InterruptedException ()을 던지십시오. } else {// 트랜잭션 제출 성공적인 밸런스 = integer.parseint (jedis.get ( "balance")); 부채 = integer.parseint (jedis.get ( "부채")); System.out.println ( "트랜잭션 실행 종료 공제 ..."); System.out.println ( "사용 가능한 잔액 :"+밸런스); System.out.println ( "현재 돈 빚진 돈 :"+부채); 진실을 반환하십시오. }}}}}다시 실행하고 효과를 확인하십시오.
이는 Watch 명령이 실행 된 후 데이터가 수정되고 트랜잭션이 제출되기 전에 트랜잭션 실행이 성공하지 못하여 데이터의 보안을 보장합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.