You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2019/01/14 06:25:54 UTC

[servicecomb-pack] Diff for: [GitHub] cherrylzhao closed pull request #378: Scb 1103

diff --git a/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_cancel_scenario.feature b/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_cancel_scenario.feature
index ce50cb31..cca3188f 100644
--- a/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_cancel_scenario.feature
+++ b/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_cancel_scenario.feature
@@ -26,8 +26,10 @@ Feature: Alpha records transaction events
     Then Alpha records the following events
       | serviceName  | txType             |
       | ordering     | STARTED            |
-      | inventory    | PARTICIPATED       |
-      | payment      | PARTICIPATED       |
+      | inventory    | P_TX_STATED        |
+      | inventory    | P_TX_ENDED         |
+      | payment      | P_TX_STATED        |
+      | payment      | P_TX_ENDED         |
       | ordering     | ENDED              |
       | inventory    | COORDINATED        |
 
diff --git a/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_confirm_scenario.feature b/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_confirm_scenario.feature
index 40886c2d..81ef8318 100644
--- a/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_confirm_scenario.feature
+++ b/acceptance-tests/acceptance-pack-tcc-spring-demo/src/test/resources/pack_tcc_confirm_scenario.feature
@@ -26,8 +26,10 @@ Feature: Alpha records transaction events
     Then Alpha records the following events
       | serviceName  | txType             |
       | ordering     | STARTED            |
-      | inventory    | PARTICIPATED       |
-      | payment      | PARTICIPATED       |
+      | inventory    | P_TX_STATED        |
+      | inventory    | P_TX_ENDED         |
+      | payment      | P_TX_STATED        |
+      | payment      | P_TX_ENDED         |
       | ordering     | ENDED              |
       | inventory    | COORDINATED        |
       | payment      | COORDINATED        |
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java
index d92c55ac..2c00932c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/GrpcTccEventService.java
@@ -23,14 +23,7 @@
 import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
 import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventService;
-import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
-import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc;
+import org.apache.servicecomb.pack.contract.grpc.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,11 +58,20 @@ public void onTccTransactionStarted(GrpcTccTransactionStartedEvent request, Stre
   }
 
   @Override
-  public void participate(GrpcTccParticipatedEvent request, StreamObserver<GrpcAck> responseObserver) {
-    LOG.info("Received participated event from service {} , global tx id: {}, local tx id: {}", request.getServiceName(),
+  public void onParticipationStarted(GrpcParticipationStartedEvent request, StreamObserver<GrpcAck> responseObserver) {
+    LOG.info("Received participation started event from service {} , global tx id: {}, local tx id: {}", request.getServiceName(),
         request.getGlobalTxId(), request.getLocalTxId()) ;
     responseObserver.onNext(
-        tccTxEventService.onParticipatedEvent(EventConverter.convertToParticipatedEvent(request)) ? ALLOW : REJECT);
+        tccTxEventService.onParticipationStartedEvent(EventConverter.convertToParticipatedEvent(request)) ? ALLOW : REJECT);
+    responseObserver.onCompleted();
+  }
+
+  @Override
+  public void onParticipationEnded(GrpcParticipationEndedEvent request, StreamObserver<GrpcAck> responseObserver) {
+    LOG.info("Received participation ended event from service {} , global tx id: {}, local tx id: {}", request.getServiceName(),
+        request.getGlobalTxId(), request.getLocalTxId()) ;
+    responseObserver.onNext(
+            tccTxEventService.onParticipationEndedEvent(EventConverter.convertToParticipatedEvent(request)) ? ALLOW : REJECT);
     responseObserver.onCompleted();
   }
 
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java
index 8c65f40d..ea65b744 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/callback/TccCallbackEngine.java
@@ -43,6 +43,7 @@
   public boolean execute(GlobalTxEvent request) {
     AtomicBoolean result = new AtomicBoolean(true);
     tccTxEventRepository.findParticipatedByGlobalTxId(request.getGlobalTxId()).ifPresent(e ->
+        // Just call the confirm or cancel method of the omega instance
         e.stream().filter(d -> d.getStatus().equals(TransactionStatus.Succeed.name())).forEach(p -> {
           try {
             omegaCallbackWrapper.invoke(p, TransactionStatus.valueOf(request.getStatus()));
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java
index 179e70a3..3748d3d7 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/EventConverter.java
@@ -18,14 +18,24 @@
 package org.apache.servicecomb.pack.alpha.server.tcc.jpa;
 
 import org.apache.servicecomb.pack.common.TransactionStatus;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
+import org.apache.servicecomb.pack.contract.grpc.*;
 
 public class EventConverter {
 
-  public static ParticipatedEvent convertToParticipatedEvent(GrpcTccParticipatedEvent request) {
+  public static ParticipatedEvent convertToParticipatedEvent(GrpcParticipationStartedEvent request) {
+    return new ParticipatedEvent(
+        request.getServiceName(),
+        request.getInstanceId(),
+        request.getGlobalTxId(),
+        request.getLocalTxId(),
+        request.getParentTxId(),
+        request.getConfirmMethod(),
+        request.getCancelMethod(),
+        ""
+    );
+  }
+
+  public static ParticipatedEvent convertToParticipatedEvent(GrpcParticipationEndedEvent request) {
     return new ParticipatedEvent(
         request.getServiceName(),
         request.getInstanceId(),
@@ -83,14 +93,25 @@ public static TccTxEvent convertToTccTxEvent(GrpcTccTransactionEndedEvent event)
         event.getStatus());
   }
 
-  public static TccTxEvent convertToTccTxEvent(GrpcTccParticipatedEvent event) {
+  public static TccTxEvent convertToTccTxEvent(GrpcParticipationStartedEvent event) {
     return new TccTxEvent(event.getServiceName(),
         event.getInstanceId(),
         event.getGlobalTxId(),
         event.getLocalTxId(),
         event.getParentTxId(),
-        TccTxType.PARTICIPATED.name(),
-        toMethodInfo(event.getCancelMethod(), event.getConfirmMethod()),
+        TccTxType.P_TX_STATED.name(),
+        toMethodInfo(event.getConfirmMethod(), event.getCancelMethod()),
+        "");
+  }
+
+  public static TccTxEvent convertToTccTxEvent(GrpcParticipationEndedEvent event) {
+    return new TccTxEvent(event.getServiceName(),
+        event.getInstanceId(),
+        event.getGlobalTxId(),
+        event.getLocalTxId(),
+        event.getParentTxId(),
+        TccTxType.P_TX_ENDED.name(),
+        toMethodInfo(event.getConfirmMethod(), event.getCancelMethod()),
         event.getStatus());
   }
 
@@ -116,12 +137,16 @@ public static TccTxEvent convertToTccTxEvent(GlobalTxEvent event) {
   }
 
   public static TccTxEvent convertToTccTxEvent(ParticipatedEvent event) {
+    // If the status is empty string
+    TccTxType txType = event.getStatus().isEmpty()?
+        TccTxType.P_TX_STATED: TccTxType.P_TX_ENDED;
+
     return new TccTxEvent(event.getServiceName(),
         event.getInstanceId(),
         event.getGlobalTxId(),
         event.getLocalTxId(),
         event.getParentTxId(),
-        TccTxType.PARTICIPATED.name(),
+        txType.name(),
         toMethodInfo(event.getConfirmMethod(), event.getCancelMethod()),
         event.getStatus());
   }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java
index c9f11061..88cd4c14 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/ParticipatedEventRepository.java
@@ -19,8 +19,13 @@
 
 import java.util.List;
 import java.util.Optional;
+
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
 
 public interface ParticipatedEventRepository extends CrudRepository<ParticipatedEvent, Long> {
 
@@ -29,4 +34,15 @@
 
   @Query(value = "SELECT t FROM ParticipatedEvent AS t WHERE t.globalTxId = ?1 and t.localTxId = ?2")
   Optional<ParticipatedEvent> findByUniqueKey(String globalTxId, String localTxId);
+
+//  @Query("UPDATE ParticipatedEvent t SET t.status = ?3 WHERE t.globalTxId = ?1 and t.localTxId = ?2 limit 1")
+//  void updateStatusByUniqueKey(String globalTxId, String localTxId, String status);
+
+  // TODO: Useless?
+  @Transactional
+  @Modifying(clearAutomatically = true)
+  @Query("UPDATE ParticipatedEvent t SET t.status = :status WHERE t.globalTxId = :globalTxId and t.localTxId = :localTxId")
+  void updateStatusByUniqueKey(@Param("globalTxId") String globalTxId,
+                               @Param("localTxId") String localTxId,
+                               @Param("status") String status);
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java
index af06a0e3..52378388 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxEvent.java
@@ -122,6 +122,10 @@ public Date getLastModified() {
     return lastModified;
   }
 
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
   @Override
   public String toString() {
     return "TccTxEvent{" +
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java
index c8007ec2..343f0fe6 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/jpa/TccTxType.java
@@ -21,6 +21,7 @@
   STARTED,
   ENDED,
   END_TIMEOUT,
-  PARTICIPATED,
+  P_TX_STATED,
+  P_TX_ENDED,
   COORDINATED
 }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java
index 91309110..3fadb53e 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryTxEventRepository.java
@@ -57,6 +57,11 @@ public void saveParticipatedEvent(ParticipatedEvent event) {
     save(EventConverter.convertToTccTxEvent(event));
   }
 
+  @Override
+  public void updateParticipatedEventStatus(ParticipatedEvent event) {
+    save(EventConverter.convertToTccTxEvent(event));
+  }
+
   @Override
   public void coordinated(TccTxEvent event) {
   }
@@ -83,7 +88,7 @@ public void save(TccTxEvent event) {
     return Optional.of(
         findByGlobalTxId(globalTxId)
             .orElse(new ArrayList<>()).stream()
-        .filter(e -> TccTxType.PARTICIPATED.name().equals(e.getTxType()))
+        .filter(e -> TccTxType.P_TX_ENDED.name().equals(e.getTxType()))
         .map(EventConverter::convertToParticipatedEvent).collect(Collectors.toList())
     );
   }
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java
index b48e984b..5841ce9c 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/RDBTxEventRepository.java
@@ -59,6 +59,14 @@ public void saveGlobalTxEvent(GlobalTxEvent event) {
   @Override
   @Transactional
   public void saveParticipatedEvent(ParticipatedEvent event) {
+    // we dont need to save participation-started event to the participatedEventRepository
+    // saveTccEventHere
+    tccTxEventDBRepository.save(EventConverter.convertToTccTxEvent(event));
+  }
+
+  @Override
+  @Transactional
+  public void updateParticipatedEventStatus(ParticipatedEvent event) {
     participatedEventRepository.save(event);
     // saveTccEventHere
     tccTxEventDBRepository.save(EventConverter.convertToTccTxEvent(event));
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java
index f7afccc8..f6478dc4 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventRepository.java
@@ -33,6 +33,8 @@
 
   void saveParticipatedEvent(ParticipatedEvent event);
 
+  void updateParticipatedEventStatus(ParticipatedEvent event);
+
   void coordinated(TccTxEvent event);
 
   void save(TccTxEvent event);
diff --git a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java
index 99a60835..e5d44a11 100644
--- a/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java
+++ b/alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventService.java
@@ -63,14 +63,14 @@ public boolean onTccStartedEvent(GlobalTxEvent globalTxEvent) {
     return true;
   }
 
-  public boolean onParticipatedEvent(ParticipatedEvent participatedEvent) {
-    LOG.info("Registered Participated event, global tx: {}, local tx: {}, parent id: {}, "
+  public boolean onParticipationStartedEvent(ParticipatedEvent participatedEvent) {
+    LOG.info("Registered Participation started event, global tx: {}, local tx: {}, parent id: {}, "
             + "confirm: {}, cancel: {}, status: {}, service [{}] instanceId [{}]",
         participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), participatedEvent.getParentTxId(),
         participatedEvent.getConfirmMethod(), participatedEvent.getCancelMethod(), participatedEvent.getStatus(),
         participatedEvent.getServiceName(), participatedEvent.getInstanceId());
     try {
-      if (!tccTxEventRepository.findByUniqueKey(participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), TccTxType.PARTICIPATED).isPresent()) {
+      if (!tccTxEventRepository.findByUniqueKey(participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), TccTxType.P_TX_STATED).isPresent()) {
         tccTxEventRepository.saveParticipatedEvent(participatedEvent);
       }
     } catch (Exception ex) {
@@ -81,6 +81,24 @@ public boolean onParticipatedEvent(ParticipatedEvent participatedEvent) {
     return true;
   }
 
+  public boolean onParticipationEndedEvent(ParticipatedEvent participatedEvent) {
+    LOG.info("Registered Participation ended event, global tx: {}, local tx: {}, parent id: {}, "
+                    + "confirm: {}, cancel: {}, status: {}, service [{}] instanceId [{}]",
+            participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), participatedEvent.getParentTxId(),
+            participatedEvent.getConfirmMethod(), participatedEvent.getCancelMethod(), participatedEvent.getStatus(),
+            participatedEvent.getServiceName(), participatedEvent.getInstanceId());
+    try {
+      if (!tccTxEventRepository.findByUniqueKey(participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), TccTxType.P_TX_ENDED).isPresent()) {
+        tccTxEventRepository.updateParticipatedEventStatus(participatedEvent);
+      }
+    } catch (Exception ex) {
+      LOG.warn("Add participateEvent triggered exception, globalTxId:{}, localTxId:{}, ",
+              participatedEvent.getGlobalTxId(), participatedEvent.getLocalTxId(), ex);
+      return false;
+    }
+    return true;
+  }
+
   public boolean onTccEndedEvent(GlobalTxEvent globalTxEvent) {
     LOG.info("Registered TccEnded event, global tx: {}, local tx: {}, parent id: {}, "
             + "txType: {}, service [{}] instanceId [{}]",
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java
index e26b7875..df5161b8 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/AlphaTccServerTestBase.java
@@ -39,14 +39,7 @@
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.EventConverter;
 import org.apache.servicecomb.pack.alpha.server.tcc.service.TccTxEventRepository;
 import org.apache.servicecomb.pack.common.TransactionStatus;
-import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
-import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc;
+import org.apache.servicecomb.pack.contract.grpc.*;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceBlockingStub;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceStub;
 import org.hamcrest.core.Is;
@@ -154,15 +147,27 @@ public void assertOnTransactionStart() {
   public void assertOnParticipated() {
     asyncStub.onConnected(serviceConfig, commandStreamObserver);
     awaitUntilConnected();
-    blockingStub.participate(newParticipatedEvent("Succeed"));
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     List<TccTxEvent> events = tccTxEventRepository.findByGlobalTxId(globalTxId).get();
-    assertThat(events.size(),  is(1));
-    TccTxEvent event = events.iterator().next();
+
+    assertThat(events.size(),  is(2));
+
+    TccTxEvent event = events.get(0);
     assertThat(event.getGlobalTxId(), is(globalTxId));
     assertThat(event.getLocalTxId(), is(localTxId));
     assertThat(event.getInstanceId(), is(instanceId));
     assertThat(event.getServiceName(), is(serviceName));
+    assertThat(event.getTxType(), is(TccTxType.P_TX_STATED.name()));
+    assertThat(EventConverter.getMethodName(event.getMethodInfo(), true), is(confirmMethod));
+    assertThat(EventConverter.getMethodName(event.getMethodInfo(), false), is(cancelMethod));
+
+    event = events.get(1);
+    assertThat(event.getGlobalTxId(), is(globalTxId));
+    assertThat(event.getLocalTxId(), is(localTxId));
+    assertThat(event.getInstanceId(), is(instanceId));
+    assertThat(event.getServiceName(), is(serviceName));
+    assertThat(event.getTxType(), is(TccTxType.P_TX_ENDED.name()));
     assertThat(EventConverter.getMethodName(event.getMethodInfo(), true), is(confirmMethod));
     assertThat(EventConverter.getMethodName(event.getMethodInfo(), false), is(cancelMethod));
     assertThat(event.getStatus(), is("Succeed"));
@@ -173,7 +178,8 @@ public void assertOnTccTransactionSucceedEnded() {
     asyncStub.onConnected(serviceConfig, commandStreamObserver);
     awaitUntilConnected();
     blockingStub.onTccTransactionStarted(newTxStart());
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     blockingStub.onTccTransactionEnded(newTxEnd("Succeed"));
 
     await().atMost(2, SECONDS).until(() -> !receivedCommands.isEmpty());
@@ -192,7 +198,8 @@ public void assertOnTccTransactionFailedEnded() {
     asyncStub.onConnected(serviceConfig, commandStreamObserver);
     awaitUntilConnected();
     blockingStub.onTccTransactionStarted(newTxStart());
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     blockingStub.onTccTransactionEnded(newTxEnd("Failed"));
 
     await().atMost(2, SECONDS).until(() -> !receivedCommands.isEmpty());
@@ -211,7 +218,8 @@ public void assertOnCallbackNotExist() {
 
     OmegaCallbacksRegistry.getRegistry().remove(serviceName);
     blockingStub.onTccTransactionStarted(newTxStart());
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     GrpcAck result = blockingStub.onTccTransactionEnded(newTxEnd("Succeed"));
     assertThat(result.getAborted(), is(true));
   }
@@ -223,7 +231,8 @@ public void assertOnCallbacksExecuteError() {
 
     OmegaCallbacksRegistry.getRegistry().get(serviceName).put(instanceId, new GrpcOmegaTccCallback(null));
     blockingStub.onTccTransactionStarted(newTxStart());
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     GrpcAck result = blockingStub.onTccTransactionEnded(newTxEnd("Succeed"));
 
     assertThat(result.getAborted(), is(true));
@@ -244,7 +253,8 @@ public void assertOnSwitchOtherCallbackInstance() {
 
     OmegaCallbacksRegistry.getRegistry().get(serviceName).remove(instanceId);
     blockingStub.onTccTransactionStarted(newTxStart());
-    blockingStub.participate(newParticipatedEvent("Succeed"));
+    blockingStub.onParticipationStarted(newParticipationStartedEvent());
+    blockingStub.onParticipationEnded(newParticipationEndedEvent("Succeed"));
     GrpcAck result = blockingStub.onTccTransactionEnded(newTxEnd("Succeed"));
 
     await().atMost(2, SECONDS).until(() -> !receivedCommands.isEmpty());
@@ -257,18 +267,29 @@ public void assertOnSwitchOtherCallbackInstance() {
     assertThat(result.getAborted(), is(false));
   }
 
-  private GrpcTccParticipatedEvent newParticipatedEvent(String status) {
-    return GrpcTccParticipatedEvent.newBuilder()
+  private GrpcParticipationStartedEvent newParticipationStartedEvent() {
+    return GrpcParticipationStartedEvent.newBuilder()
         .setGlobalTxId(globalTxId)
         .setLocalTxId(localTxId)
         .setServiceName(serviceName)
         .setInstanceId(instanceId)
-        .setCancelMethod(cancelMethod)
         .setConfirmMethod(confirmMethod)
-        .setStatus(status)
+        .setCancelMethod(cancelMethod)
         .build();
   }
 
+  private GrpcParticipationEndedEvent newParticipationEndedEvent(String status) {
+    return GrpcParticipationEndedEvent.newBuilder()
+            .setGlobalTxId(globalTxId)
+            .setLocalTxId(localTxId)
+            .setServiceName(serviceName)
+            .setInstanceId(instanceId)
+            .setConfirmMethod(confirmMethod)
+            .setCancelMethod(cancelMethod)
+            .setStatus(status)
+            .build();
+  }
+
   private GrpcTccTransactionStartedEvent newTxStart() {
     return GrpcTccTransactionStartedEvent.newBuilder()
         .setGlobalTxId(globalTxId)
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java
index 7491b1dd..7064a073 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/TccCallbackEngineTest.java
@@ -81,10 +81,13 @@
       .build();
 
   private ParticipatedEvent participatedEvent;
+  private ParticipatedEvent participationStartedEvent;
   private GlobalTxEvent tccEndEvent;
 
   @Before
   public void init() {
+    participationStartedEvent = new ParticipatedEvent(serviceName, instanceId, globalTxId, localTxId,
+        parentTxId, confirmMethod, cancelMethod, "");
     participatedEvent = new ParticipatedEvent(serviceName, instanceId, globalTxId, localTxId,
         parentTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed.name());
 
@@ -101,8 +104,8 @@ public void sendCoordinateCommandAfterTccEnd() {
     StreamObserver responseObserver = mock(StreamObserver.class);
     OmegaCallbacksRegistry.register(serviceConfig, responseObserver);
 
-    tccTxEventService.onParticipatedEvent(participatedEvent);
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participatedEvent);
 
     tccTxEventService.onTccEndedEvent(tccEndEvent);
 
@@ -115,7 +118,8 @@ public void sendCoordinateFailedForOmegaDown() throws InterruptedException {
     doThrow(IllegalArgumentException.class).when(responseObserver).onNext(any());
     OmegaCallbacksRegistry.register(serviceConfig, responseObserver);
 
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participatedEvent);
     boolean result = tccCallbackEngine.execute(tccEndEvent);
     assertThat(result, is(false));
 
@@ -135,7 +139,8 @@ public void doRetryCoordinateTillOmegaReceived() throws InterruptedException {
     doThrow(IllegalArgumentException.class).when(failedResponseObserver).onNext(any());
     OmegaCallbacksRegistry.register(serviceConfig, failedResponseObserver);
 
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participatedEvent);
     boolean result = tccCallbackEngine.execute(tccEndEvent);
     assertThat(result, is(false));
 
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java
index 156e8e65..add543d7 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/MemoryEventRegistryTest.java
@@ -45,8 +45,8 @@
   @Before
   public void setup() {
     registry.save(someTccTxEvent(localTxId1, TccTxType.STARTED));
-    registry.save(someTccTxEvent(localTxId1, TccTxType.PARTICIPATED));
-    registry.save(someTccTxEvent(localTxId2, TccTxType.PARTICIPATED));
+    registry.save(someTccTxEvent(localTxId1, TccTxType.P_TX_STATED));
+    registry.save(someTccTxEvent(localTxId2, TccTxType.P_TX_ENDED));
   }
 
   private TccTxEvent someTccTxEvent(String localTxId, TccTxType tccTxType) {
@@ -65,9 +65,13 @@ public void testFindByGlobalTxId() {
 
   @Test
   public void testfindByGlobalTxIdAndTxType() {
-    Optional<List<TccTxEvent>> result = registry.findByGlobalTxIdAndTxType(gloableTxId, TccTxType.PARTICIPATED);
+    Optional<List<TccTxEvent>> result = registry.findByGlobalTxIdAndTxType(gloableTxId, TccTxType.P_TX_STATED);
     assertThat(result.isPresent(), is(true));
-    assertThat(result.get().size(), is(2));
+    assertThat(result.get().size(), is(1));
+
+    result = registry.findByGlobalTxIdAndTxType(gloableTxId, TccTxType.P_TX_ENDED);
+    assertThat(result.isPresent(), is(true));
+    assertThat(result.get().size(), is(1));
 
     result = registry.findByGlobalTxIdAndTxType(gloableTxId, TccTxType.STARTED);
     assertThat(result.isPresent(), is(true));
@@ -79,15 +83,15 @@ public void testfindByGlobalTxIdAndTxType() {
 
   @Test
   public void testfindByUniqueKey() {
-    Optional<TccTxEvent> result = registry.findByUniqueKey(gloableTxId, localTxId1, TccTxType.PARTICIPATED);
+    Optional<TccTxEvent> result = registry.findByUniqueKey(gloableTxId, localTxId1, TccTxType.P_TX_STATED);
     assertThat(result.isPresent(), is(true));
     assertThat(result.get().getLocalTxId(), is(localTxId1));
-    assertThat(result.get().getTxType(), is(TccTxType.PARTICIPATED.name()));
+    assertThat(result.get().getTxType(), is(TccTxType.P_TX_STATED.name()));
 
-    result = registry.findByUniqueKey(gloableTxId, localTxId2, TccTxType.PARTICIPATED);
+    result = registry.findByUniqueKey(gloableTxId, localTxId2, TccTxType.P_TX_ENDED);
     assertThat(result.isPresent(), is(true));
     assertThat(result.get().getLocalTxId(), is(localTxId2));
-    assertThat(result.get().getTxType(), is(TccTxType.PARTICIPATED.name()));
+    assertThat(result.get().getTxType(), is(TccTxType.P_TX_ENDED.name()));
 
     result = registry.findByUniqueKey(gloableTxId, localTxId1, TccTxType.ENDED);
     assertThat(result.isPresent(), is(false));
@@ -102,7 +106,7 @@ public void testfindAll() {
     for(TccTxEvent event : result) {
       events.add(event.getTxType());
     }
-    assertThat(events, contains("STARTED", "PARTICIPATED", "PARTICIPATED"));
+    assertThat(events, contains("STARTED", "P_TX_STATED", "P_TX_ENDED"));
   }
 
   @Test
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java
index 476bd0bd..ad334ee7 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTest.java
@@ -35,7 +35,6 @@
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.ParticipatedEventRepository;
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxType;
 import org.apache.servicecomb.pack.alpha.server.tcc.TccApplication;
-import org.apache.servicecomb.pack.alpha.server.tcc.TccConfiguration;
 import org.apache.servicecomb.pack.alpha.server.tcc.callback.OmegaCallbacksRegistry;
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.GlobalTxEvent;
 import org.apache.servicecomb.pack.alpha.server.tcc.jpa.TccTxEvent;
@@ -84,14 +83,16 @@
       .build();
 
   private GlobalTxEvent tccStartEvent;
-  private ParticipatedEvent participatedEvent;
+  private ParticipatedEvent participationStartedEvent;
+  private ParticipatedEvent participationEndedEvent;
   private GlobalTxEvent tccEndEvent;
   private TccTxEvent coordinateEvent;
 
   @Before
   public void setup() {
     tccStartEvent = newGlobalTxEvent(TccTxType.STARTED, globalTxId, TransactionStatus.Succeed);
-    participatedEvent = newParticipateEvent(globalTxId, TransactionStatus.Succeed);
+    participationStartedEvent = newParticipationStartedEvent(globalTxId);
+    participationEndedEvent = newParticipationEndedEvent(globalTxId, TransactionStatus.Succeed);
     tccEndEvent = newGlobalTxEvent(TccTxType.ENDED, globalTxId, TransactionStatus.Succeed);
     coordinateEvent = newTccTxEvent(TccTxType.COORDINATED, globalTxId, TransactionStatus.Succeed);
   }
@@ -106,7 +107,8 @@ public void onlyCoordinateParticipatedEventOnce() {
     OmegaCallbacksRegistry.register(serviceConfig, observer);
 
     tccTxEventService.onTccStartedEvent(tccStartEvent);
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participationEndedEvent);
     tccTxEventService.onTccEndedEvent(tccEndEvent);
     tccTxEventService.onCoordinatedEvent(coordinateEvent);
 
@@ -123,7 +125,8 @@ public void handleTimeoutGlobalTraction() throws InterruptedException {
     OmegaCallbacksRegistry.register(serviceConfig, observer);
 
     tccTxEventService.onTccStartedEvent(tccStartEvent);
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participationEndedEvent);
 
     Thread.sleep(3000l);
     Date deadLine = new Date(System.currentTimeMillis() - SECONDS.toMillis(2));
@@ -141,7 +144,7 @@ public void handleTimeoutGlobalTraction() throws InterruptedException {
     verify(observer).onNext(any());
 
     Optional<List<TccTxEvent>> events = tccTxEventRepository.findByGlobalTxId(globalTxId);
-    assertThat(events.get().size(), is(3));
+    assertThat(events.get().size(), is(4));
   }
 
   @Test
@@ -150,7 +153,8 @@ public void clearUpCompletedTxFromGlobalTxTable() {
     OmegaCallbacksRegistry.register(serviceConfig, observer);
 
     tccTxEventService.onTccStartedEvent(tccStartEvent);
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participationEndedEvent);
     tccTxEventService.onTccEndedEvent(tccEndEvent);
     tccTxEventService.onCoordinatedEvent(coordinateEvent);
 
@@ -160,7 +164,7 @@ public void clearUpCompletedTxFromGlobalTxTable() {
     assertThat(globalTxEventRepository.findByGlobalTxId(globalTxId).isPresent(), is(false));
 
     Optional<List<TccTxEvent>> events = tccTxEventRepository.findByGlobalTxId(globalTxId);
-    assertThat(events.get().size(), is(4));
+    assertThat(events.get().size(), is(5));
   }
 
   @Test
@@ -170,14 +174,16 @@ public void clearUpCompletedTxFromGlobalTxTableMoreThanOne() {
 
     // one global tx
     tccTxEventService.onTccStartedEvent(tccStartEvent);
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participationStartedEvent);
+    tccTxEventService.onParticipationEndedEvent(participationEndedEvent);
     tccTxEventService.onTccEndedEvent(tccEndEvent);
     tccTxEventService.onCoordinatedEvent(coordinateEvent);
 
     // another global tx
     String globalTxId_2 = uniquify("globalTxId");
     tccTxEventService.onTccStartedEvent(newGlobalTxEvent(TccTxType.STARTED, globalTxId_2, TransactionStatus.Succeed));
-    tccTxEventService.onParticipatedEvent(newParticipateEvent(globalTxId_2, TransactionStatus.Succeed));
+    tccTxEventService.onParticipationStartedEvent(newParticipationStartedEvent(globalTxId_2));
+    tccTxEventService.onParticipationEndedEvent(newParticipationEndedEvent(globalTxId_2, TransactionStatus.Succeed));
     tccTxEventService.onTccEndedEvent(newGlobalTxEvent(TccTxType.ENDED, globalTxId_2, TransactionStatus.Succeed));
     tccTxEventService.onCoordinatedEvent(newTccTxEvent(TccTxType.COORDINATED, globalTxId_2, TransactionStatus.Succeed));
 
@@ -187,14 +193,19 @@ public void clearUpCompletedTxFromGlobalTxTableMoreThanOne() {
     assertThat(globalTxEventRepository.findByGlobalTxId(globalTxId).isPresent(), is(false));
 
     Optional<List<TccTxEvent>> events = tccTxEventRepository.findByGlobalTxId(globalTxId);
-    assertThat(events.get().size(), is(4));
+    assertThat(events.get().size(), is(5));
 
     events = tccTxEventRepository.findByGlobalTxId(globalTxId_2);
-    assertThat(events.get().size(), is(4));
+    assertThat(events.get().size(), is(5));
 
   }
 
-  private ParticipatedEvent newParticipateEvent(String globalTxId, TransactionStatus transactionStatus) {
+  private ParticipatedEvent newParticipationStartedEvent(String globalTxId) {
+    return new ParticipatedEvent(serviceName, instanceId, globalTxId, localTxId,
+        parentTxId, confirmMethod, cancelMethod, "");
+  }
+
+  private ParticipatedEvent newParticipationEndedEvent(String globalTxId, TransactionStatus transactionStatus) {
     return new ParticipatedEvent(serviceName, instanceId, globalTxId, localTxId,
         parentTxId, confirmMethod, cancelMethod, transactionStatus.name());
   }
diff --git a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java
index d3e52cc4..f7f5e6fc 100644
--- a/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java
+++ b/alpha/alpha-server/src/test/java/org/apache/servicecomb/pack/alpha/server/tcc/service/TccTxEventServiceTransactionTest.java
@@ -103,7 +103,7 @@ public void rollbackAfterSaveTccTxEventDbFailure() {
     Optional<List<GlobalTxEvent>> startEvents = globalTxEventRepository.findByGlobalTxId(globalTxId);
     assertThat(startEvents.isPresent(), is(false));
 
-    tccTxEventService.onParticipatedEvent(participatedEvent);
+    tccTxEventService.onParticipationStartedEvent(participatedEvent);
     Optional<List<ParticipatedEvent>> participates = participatedEventRepository.findByGlobalTxId(globalTxId);
     assertThat(participates.isPresent(), is(false));
 
diff --git a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSender.java b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSender.java
index e4755425..3acb1483 100644
--- a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSender.java
+++ b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSender.java
@@ -19,22 +19,13 @@
 
 import io.grpc.ManagedChannel;
 
+import org.apache.servicecomb.pack.contract.grpc.*;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.LoadBalanceContext;
 import org.apache.servicecomb.pack.omega.context.ServiceConfig;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
-import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceBlockingStub;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceStub;
 
@@ -79,11 +70,17 @@ public String target() {
   }
 
   @Override
-  public AlphaResponse participate(ParticipatedEvent participateEvent) {
-    GrpcAck grpcAck = tccBlockingEventService.participate(convertTo(participateEvent));
+  public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+    GrpcAck grpcAck = tccBlockingEventService.onParticipationStarted(convertTo(participationStartedEvent));
     return new AlphaResponse(grpcAck.getAborted());
   }
 
+  @Override
+  public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
+      GrpcAck grpcAck = tccBlockingEventService.onParticipationEnded(convertTo(participationEndedEvent));
+      return new AlphaResponse(grpcAck.getAborted());
+  }
+
   @Override
   public AlphaResponse tccTransactionStart(TccStartedEvent tccStartEvent) {
     GrpcAck grpcAck = tccBlockingEventService.onTccTransactionStarted(convertTo(tccStartEvent));
@@ -142,16 +139,27 @@ private GrpcTccTransactionEndedEvent convertTo(TccEndedEvent tccEndEvent) {
         .build();
   }
 
-  private GrpcTccParticipatedEvent convertTo(ParticipatedEvent participateEvent) {
-    return GrpcTccParticipatedEvent.newBuilder()
+  private GrpcParticipationStartedEvent convertTo(ParticipationStartedEvent participationStartedEvent) {
+    return GrpcParticipationStartedEvent.newBuilder()
         .setServiceName(serviceConfig.getServiceName())
         .setInstanceId(serviceConfig.getInstanceId())
-        .setGlobalTxId(participateEvent.getGlobalTxId())
-        .setLocalTxId(participateEvent.getLocalTxId())
-        .setParentTxId(participateEvent.getParentTxId())
-        .setCancelMethod(participateEvent.getCancelMethod())
-        .setConfirmMethod(participateEvent.getConfirmMethod())
-        .setStatus(participateEvent.getStatus().toString())
+        .setGlobalTxId(participationStartedEvent.getGlobalTxId())
+        .setLocalTxId(participationStartedEvent.getLocalTxId())
+        .setParentTxId(participationStartedEvent.getParentTxId())
+        .setConfirmMethod(participationStartedEvent.getConfirmMethod())
+        .setCancelMethod(participationStartedEvent.getCancelMethod())
         .build();
   }
+  private GrpcParticipationEndedEvent convertTo(ParticipationEndedEvent participationEndedEvent) {
+    return GrpcParticipationEndedEvent.newBuilder()
+      .setServiceName(serviceConfig.getServiceName())
+      .setInstanceId(serviceConfig.getInstanceId())
+      .setGlobalTxId(participationEndedEvent.getGlobalTxId())
+      .setLocalTxId(participationEndedEvent.getLocalTxId())
+      .setParentTxId(participationEndedEvent.getParentTxId())
+      .setConfirmMethod(participationEndedEvent.getConfirmMethod())
+      .setCancelMethod(participationEndedEvent.getCancelMethod())
+      .setStatus(participationEndedEvent.getStatus().toString())
+      .build();
+  }
 }
diff --git a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSender.java b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSender.java
index 6356b1e8..145d8c79 100644
--- a/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSender.java
+++ b/omega/omega-connector/omega-connector-grpc/src/main/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSender.java
@@ -27,7 +27,8 @@
 import org.apache.servicecomb.pack.omega.transaction.OmegaException;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationEndedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
 
@@ -39,19 +40,35 @@ public TccLoadBalanceSender(LoadBalanceContext loadContext,
   }
 
   @Override
-  public AlphaResponse participate(ParticipatedEvent participateEvent) {
+  public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
     do {
       final TccMessageSender messageSender = pickMessageSender();
-      Optional<AlphaResponse> response = doGrpcSend(messageSender, participateEvent, new SenderExecutor<ParticipatedEvent>() {
+      Optional<AlphaResponse> response = doGrpcSend(messageSender, participationStartedEvent, new SenderExecutor<ParticipationStartedEvent>() {
         @Override
-        public AlphaResponse apply(ParticipatedEvent event) {
-          return messageSender.participate(event);
+        public AlphaResponse apply(ParticipationStartedEvent event) {
+          return messageSender.participationStart(event);
         }
       });
       if (response.isPresent()) return response.get();
     } while (!Thread.currentThread().isInterrupted());
 
-    throw new OmegaException("Failed to send event " + participateEvent + " due to interruption");
+    throw new OmegaException("Failed to send event " + participationStartedEvent + " due to interruption");
+  }
+
+  @Override
+  public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
+    do {
+      final TccMessageSender messageSender = pickMessageSender();
+      Optional<AlphaResponse> response = doGrpcSend(messageSender, participationEndedEvent, new SenderExecutor<ParticipationEndedEvent>() {
+        @Override
+        public AlphaResponse apply(ParticipationEndedEvent event) {
+          return messageSender.participationEnd(event);
+        }
+      });
+      if (response.isPresent()) return response.get();
+    } while (!Thread.currentThread().isInterrupted());
+
+    throw new OmegaException("Failed to send event " + participationEndedEvent + " due to interruption");
   }
 
   @Override
diff --git a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSenderTest.java b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSenderTest.java
index 0dcdb144..197a2e0f 100644
--- a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSenderTest.java
+++ b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/GrpcTccClientMessageSenderTest.java
@@ -24,20 +24,12 @@
 import static org.mockito.Mockito.verify;
 
 import org.apache.servicecomb.pack.common.TransactionStatus;
+import org.apache.servicecomb.pack.contract.grpc.*;
 import org.apache.servicecomb.pack.omega.context.ServiceConfig;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
-import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc.TccEventServiceImplBase;
 import org.junit.Before;
 import org.junit.Rule;
@@ -198,14 +190,15 @@ public void onTccTransactionEnded(GrpcTccTransactionEndedEvent request,
   }
 
   @Test
-  public void serviceOnParticipateTest() {
+  public void serviceOnStartParticipateTest() {
 
-    final GrpcTccParticipatedEvent[] requestCaptor = new GrpcTccParticipatedEvent[1];
-    ParticipatedEvent event = new ParticipatedEvent(globalTxId,localTxId, parentTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed);
+    final GrpcParticipationStartedEvent[] requestCaptor = new GrpcParticipationStartedEvent[1];
+    ParticipationStartedEvent event = new ParticipationStartedEvent(globalTxId,localTxId, parentTxId, confirmMethod,
+        cancelMethod);
 
     TccEventServiceImplBase serviceImpl = new TccEventServiceImplBase() {
 
-      public void participate(GrpcTccParticipatedEvent request,
+      public void onParticipationStarted(GrpcParticipationStartedEvent request,
           StreamObserver<GrpcAck> responseObserver) {
         requestCaptor[0] = request;
         responseObserver.onNext(ack);
@@ -214,15 +207,41 @@ public void participate(GrpcTccParticipatedEvent request,
     };
 
     serviceRegistry.addService(serviceImpl);
-    AlphaResponse response =service.participate(event);
+    AlphaResponse response =service.participationStart(event);
+
+    assertThat(requestCaptor[0].getServiceName(), is(serviceConfig.serviceName()));
+    assertThat(requestCaptor[0].getInstanceId(), is(serviceConfig.instanceId()));
+    assertThat(requestCaptor[0].getGlobalTxId(), is(globalTxId));
+    assertThat(requestCaptor[0].getLocalTxId(), is(localTxId));
+    assertThat(requestCaptor[0].getParentTxId(), is(parentTxId));
+    assertThat(response.aborted(), is(false));
+  }
+
+  @Test
+  public void serviceOnEndParticipateTest() {
+
+    final GrpcParticipationEndedEvent[] requestCaptor = new GrpcParticipationEndedEvent[1];
+    ParticipationEndedEvent event = new ParticipationEndedEvent(globalTxId,localTxId, parentTxId, confirmMethod,
+        cancelMethod, TransactionStatus.Succeed);
+
+    TccEventServiceImplBase serviceImpl = new TccEventServiceImplBase() {
+
+      public void onParticipationEnded(GrpcParticipationEndedEvent request,
+          StreamObserver<GrpcAck> responseObserver) {
+        requestCaptor[0] = request;
+        responseObserver.onNext(ack);
+        responseObserver.onCompleted();
+      }
+    };
+
+    serviceRegistry.addService(serviceImpl);
+    AlphaResponse response =service.participationEnd(event);
 
     assertThat(requestCaptor[0].getServiceName(), is(serviceConfig.serviceName()));
     assertThat(requestCaptor[0].getInstanceId(), is(serviceConfig.instanceId()));
     assertThat(requestCaptor[0].getGlobalTxId(), is(globalTxId));
     assertThat(requestCaptor[0].getLocalTxId(), is(localTxId));
     assertThat(requestCaptor[0].getParentTxId(), is(parentTxId));
-    assertThat(requestCaptor[0].getCancelMethod(), is(cancelMethod));
-    assertThat(requestCaptor[0].getConfirmMethod(), is(confirmMethod));
     assertThat(requestCaptor[0].getStatus(), is(TransactionStatus.Succeed.toString()));
     assertThat(response.aborted(), is(false));
   }
diff --git a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/MyTccEventServiceImpl.java b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/MyTccEventServiceImpl.java
index 1b5bb3b7..d3127097 100644
--- a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/MyTccEventServiceImpl.java
+++ b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/MyTccEventServiceImpl.java
@@ -22,14 +22,8 @@
 import io.grpc.stub.StreamObserver;
 import java.lang.invoke.MethodHandles;
 import java.util.Queue;
-import org.apache.servicecomb.pack.contract.grpc.GrpcAck;
-import org.apache.servicecomb.pack.contract.grpc.GrpcServiceConfig;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinateCommand;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccCoordinatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionEndedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccTransactionStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.TccEventServiceGrpc;
+
+import org.apache.servicecomb.pack.contract.grpc.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -70,8 +64,8 @@ public void onTccTransactionStarted(GrpcTccTransactionStartedEvent request,
   }
 
   @Override
-  public void participate(GrpcTccParticipatedEvent request, StreamObserver<GrpcAck> responseObserver) {
-    LOG.info("Received participated event from service {} , global tx id: {}, local tx id: {}",
+  public void onParticipationStarted(GrpcParticipationStartedEvent request, StreamObserver<GrpcAck> responseObserver) {
+    LOG.info("Received participation started event from service {} , global tx id: {}, local tx id: {}",
         request.getServiceName(),
         request.getGlobalTxId(), request.getLocalTxId());
     events.offer(request);
@@ -80,6 +74,17 @@ public void participate(GrpcTccParticipatedEvent request, StreamObserver<GrpcAck
     responseObserver.onCompleted();
   }
 
+  @Override
+  public void onParticipationEnded(GrpcParticipationEndedEvent request, StreamObserver<GrpcAck> responseObserver) {
+    LOG.info("Received participation ended event from service {} , global tx id: {}, local tx id: {}",
+            request.getServiceName(),
+            request.getGlobalTxId(), request.getLocalTxId());
+    events.offer(request);
+    sleep();
+    responseObserver.onNext(ALLOW);
+    responseObserver.onCompleted();
+  }
+
   @Override
   public void onTccTransactionEnded(GrpcTccTransactionEndedEvent request, StreamObserver<GrpcAck> responseObserver) {
     LOG.info("Received transaction end event, global tx id: {}", request.getGlobalTxId());
diff --git a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSenderTest.java b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSenderTest.java
index 810948de..03d9d872 100644
--- a/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSenderTest.java
+++ b/omega/omega-connector/omega-connector-grpc/src/test/java/org/apache/servicecomb/pack/omega/connector/grpc/tcc/TccLoadBalanceSenderTest.java
@@ -43,6 +43,7 @@
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import org.apache.servicecomb.pack.common.TransactionStatus;
+import org.apache.servicecomb.pack.contract.grpc.GrpcParticipationStartedEvent;
 import org.apache.servicecomb.pack.omega.connector.grpc.LoadBalanceSenderTestBase;
 import org.apache.servicecomb.pack.omega.connector.grpc.AlphaClusterConfig;
 import org.apache.servicecomb.pack.omega.connector.grpc.core.FastestSender;
@@ -57,10 +58,9 @@
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
-import org.apache.servicecomb.pack.contract.grpc.GrpcTccParticipatedEvent;
 import org.hamcrest.core.Is;
 import org.junit.After;
 import org.junit.AfterClass;
@@ -88,7 +88,7 @@
 
   private final ServiceConfig serviceConfig = new ServiceConfig(serviceName);
 
-  private ParticipatedEvent participatedEvent;
+  private ParticipationStartedEvent participationStartedEvent;
   private TccStartedEvent tccStartedEvent;
   private TccEndedEvent tccEndedEvent;
   private CoordinatedEvent coordinatedEvent;
@@ -130,7 +130,8 @@ public void setup() {
     loadContext =
         new LoadBalanceContextBuilder(TransactionType.TCC, clusterConfig, serviceConfig, 30, 4).build();
     tccLoadBalanceSender = new TccLoadBalanceSender(loadContext, new FastestSender());
-    participatedEvent = new ParticipatedEvent(globalTxId, localTxId, parentTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed);
+    participationStartedEvent = new ParticipationStartedEvent(globalTxId, localTxId, parentTxId, confirmMethod,
+        cancelMethod);
     tccStartedEvent = new TccStartedEvent(globalTxId, localTxId);
     tccEndedEvent = new TccEndedEvent(globalTxId, localTxId, TransactionStatus.Succeed);
     coordinatedEvent = new CoordinatedEvent(globalTxId, localTxId, parentTxId, methodName, TransactionStatus.Succeed);
@@ -162,19 +163,19 @@ public void participatedSucceed() {
     TccMessageSender actualSender = tccLoadBalanceSender.pickMessageSender();
     assertThat(actualSender.target(), is(expectSender.target()));
 
-    AlphaResponse response = tccLoadBalanceSender.participate(participatedEvent);
+    AlphaResponse response = tccLoadBalanceSender.participationStart(participationStartedEvent);
     assertThat(loadContext.getSenders().get(actualSender), greaterThan(0L));
     assertThat(response.aborted(), is(false));
 
     Integer expectPort = Integer.valueOf(expectSender.target().split(":")[1]);
-    GrpcTccParticipatedEvent result = (GrpcTccParticipatedEvent) eventsMap.get(expectPort).poll();
+    GrpcParticipationStartedEvent result = (GrpcParticipationStartedEvent) eventsMap.get(expectPort).poll();
     assertThat(result.getGlobalTxId(), is(globalTxId));
-    assertThat(result.getCancelMethod(), is(cancelMethod));
-    assertThat(result.getConfirmMethod(), is(confirmMethod));
+//    assertThat(result.getCancelMethod(), is(cancelMethod));
+//    assertThat(result.getConfirmMethod(), is(confirmMethod));
     assertThat(result.getServiceName(), is(serviceName));
     assertThat(result.getInstanceId(), is(serviceConfig.instanceId()));
     assertThat(result.getParentTxId(), is(parentTxId));
-    assertThat(result.getStatus(), is(TransactionStatus.Succeed.name()));
+//    assertThat(result.getStatus(), is(TransactionStatus.Succeed.name()));
   }
 
   @Test
@@ -189,15 +190,15 @@ public Boolean call() {
     assertThat((connected.get(8080).size() == 1 && connected.get(8090).size() == 1), is(true));
 
     // due to 8090 is slow than 8080, so 8080 will be routed with 2 times.
-    tccLoadBalanceSender.participate(participatedEvent);
-    tccLoadBalanceSender.participate(participatedEvent);
-    tccLoadBalanceSender.participate(participatedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
     assertThat(eventsMap.get(8080).size(), is(2));
     assertThat(eventsMap.get(8090).size(), is(1));
 
     // when 8080 was shutdown, request will be routed to 8090 automatically.
     servers.get(8080).shutdownNow();
-    tccLoadBalanceSender.participate(participatedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
     assertThat(eventsMap.get(8090).size(), is(2));
 
     // when 8080 was recovery, it will be routed again.
@@ -208,7 +209,7 @@ public Boolean call() {
         return connected.get(8080).size() == 3;
       }
     });
-    tccLoadBalanceSender.participate(participatedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
     assertThat(eventsMap.get(8080).size(), is(3));
   }
 
@@ -228,7 +229,7 @@ public Boolean call() {
     }
 
     try {
-      tccLoadBalanceSender.participate(participatedEvent);
+      tccLoadBalanceSender.participationStart(participationStartedEvent);
     } catch (OmegaException ex) {
       assertThat(ex.getMessage().endsWith("all alpha server is down."), is(true));
     }
@@ -240,15 +241,15 @@ public Boolean call() {
   @Test(expected = OmegaException.class)
   public void participateFailedThenAbort() {
     TccMessageSender failedSender = mock(GrpcTccClientMessageSender.class);
-    doThrow(new OmegaException("omega exception")).when(failedSender).participate((ParticipatedEvent)any());
+    doThrow(new OmegaException("omega exception")).when(failedSender).participationStart((ParticipationStartedEvent)any());
     TccMessageSender succeedSender = mock(GrpcTccClientMessageSender.class);
-    when(succeedSender.participate((ParticipatedEvent) any())).thenReturn(new AlphaResponse(false));
+    when(succeedSender.participationStart((ParticipationStartedEvent) any())).thenReturn(new AlphaResponse(false));
 
     Map<MessageSender, Long> senders = Maps.newConcurrentMap();
     senders.put(failedSender, 0l);
     senders.put(succeedSender, 10l);
     loadContext.setSenders(senders);
-    tccLoadBalanceSender.participate(participatedEvent);
+    tccLoadBalanceSender.participationStart(participationStartedEvent);
   }
 
   @Test
@@ -258,7 +259,7 @@ public void participateInterruptedFailed() throws InterruptedException {
       public void run() {
         try {
           await().atLeast(1, SECONDS);
-          tccLoadBalanceSender.participate(participatedEvent);
+          tccLoadBalanceSender.participationStart(participationStartedEvent);
         } catch (OmegaException e) {
           assertThat(e.getMessage().endsWith("interruption"), Is.is(true));
         }
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MessageConfig.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MessageConfig.java
index 415e42e9..d08be218 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MessageConfig.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/MessageConfig.java
@@ -28,10 +28,7 @@
 import org.apache.servicecomb.pack.omega.transaction.tcc.DefaultParametersContext;
 import org.apache.servicecomb.pack.omega.transaction.tcc.ParametersContext;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageSender;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.mockito.Mockito;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -123,8 +120,14 @@ public String target() {
       }
 
       @Override
-      public AlphaResponse participate(ParticipatedEvent participatedEvent) {
-        messages.add(participatedEvent.toString());
+      public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+        messages.add(participationStartedEvent.toString());
+        return new AlphaResponse(false);
+      }
+
+      @Override
+      public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
+        messages.add(participationEndedEvent.toString());
         return new AlphaResponse(false);
       }
 
diff --git a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
index 5bda4ce5..e63a48e7 100644
--- a/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
+++ b/omega/omega-spring-tx/src/test/java/org/apache/servicecomb/pack/omega/transaction/spring/TccInterceptorTest.java
@@ -31,10 +31,7 @@
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.omega.context.IdGenerator;
 import org.apache.servicecomb.pack.omega.transaction.tcc.TccMessageHandler;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -106,8 +103,12 @@ public void tccWorkflowSucceed() {
     assertArrayEquals(
         new String[] {
             new TccStartedEvent(globalTxId, globalTxId).toString(),
-            new ParticipatedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed).toString(),
-            new ParticipatedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed).toString(),
+            new ParticipationStartedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod).toString(),
+            new ParticipationEndedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod,
+                TransactionStatus.Succeed).toString(),
+            new ParticipationStartedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod).toString(),
+            new ParticipationEndedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod,
+                TransactionStatus.Succeed).toString(),
             new TccEndedEvent(globalTxId, globalTxId, TransactionStatus.Succeed).toString(),
             new CoordinatedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, TransactionStatus.Succeed).toString(),
             new CoordinatedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, TransactionStatus.Succeed).toString()
@@ -137,8 +138,12 @@ public void tccWorkflowFailed() {
     assertArrayEquals(
         new String[] {
             new TccStartedEvent(globalTxId, globalTxId).toString(),
-            new ParticipatedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod, TransactionStatus.Succeed).toString(),
-            new ParticipatedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod, TransactionStatus.Failed).toString(),
+            new ParticipationStartedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod).toString(),
+            new ParticipationEndedEvent(globalTxId, newLocalTxId, globalTxId, confirmMethod, cancelMethod,
+                TransactionStatus.Succeed).toString(),
+            new ParticipationStartedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod).toString(),
+            new ParticipationEndedEvent(globalTxId, anotherLocalTxId, globalTxId, confirmMethod, cancelMethod,
+                TransactionStatus.Failed).toString(),
             new TccEndedEvent(globalTxId, globalTxId, TransactionStatus.Failed).toString(),
             new CoordinatedEvent(globalTxId, newLocalTxId, globalTxId, cancelMethod, TransactionStatus.Succeed).toString()
         },
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccEventService.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccEventService.java
index 370fe314..69f48592 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccEventService.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccEventService.java
@@ -18,7 +18,7 @@
 package org.apache.servicecomb.pack.omega.transaction.tcc;
 
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
@@ -33,7 +33,7 @@
 
   String target();
 
-  AlphaResponse participate(ParticipatedEvent participatedEvent);
+  AlphaResponse participate(ParticipationStartedEvent participationStartedEvent);
 
   AlphaResponse tccTransactionStart(TccStartedEvent tccStartedEvent);
 
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccMessageSender.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccMessageSender.java
index a1d16a80..bf299b0c 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccMessageSender.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccMessageSender.java
@@ -18,7 +18,8 @@
 package org.apache.servicecomb.pack.omega.transaction.tcc;
 
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationEndedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.MessageSender;
@@ -26,7 +27,9 @@
 
 public interface TccMessageSender extends MessageSender {
 
-  AlphaResponse participate(ParticipatedEvent participateEvent);
+  AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent);
+
+  AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent);
 
   AlphaResponse tccTransactionStart(TccStartedEvent tccStartEvent);
 
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspect.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspect.java
index f70f61a1..282d6444 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspect.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspect.java
@@ -22,7 +22,8 @@
 import org.apache.servicecomb.pack.common.TransactionStatus;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.transaction.annotations.Participate;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationEndedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipationStartedEvent;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
@@ -58,18 +59,20 @@ Object advise(ProceedingJoinPoint joinPoint, Participate participate) throws Thr
     LOG.debug("Updated context {} for participate method {} ", context, method.toString());
 
     try {
+      tccMessageSender.participationStart(new ParticipationStartedEvent(context.globalTxId(), context.localTxId(), localTxId,
+          confirmMethod, cancelMethod));
       Object result = joinPoint.proceed();
       // Send the participate message back
-      tccMessageSender.participate(new ParticipatedEvent(context.globalTxId(), context.localTxId(), localTxId, confirmMethod,
-          cancelMethod, TransactionStatus.Succeed));
+      tccMessageSender.participationEnd(new ParticipationEndedEvent(context.globalTxId(), context.localTxId(), localTxId,
+          confirmMethod, cancelMethod, TransactionStatus.Succeed));
       // Just store the parameters into the context
       parametersContext.putParamters(context.localTxId(), joinPoint.getArgs());
       LOG.debug("Participate Transaction with context {} has finished.", context);
       return result;
     } catch (Throwable throwable) {
       // Now we don't handle the error message
-      tccMessageSender.participate(new ParticipatedEvent(context.globalTxId(), context.localTxId(), localTxId, confirmMethod,
-          cancelMethod, TransactionStatus.Failed));
+      tccMessageSender.participationEnd(new ParticipationEndedEvent(context.globalTxId(), context.localTxId(), localTxId,
+          confirmMethod, cancelMethod, TransactionStatus.Failed));
       LOG.error("Participate Transaction with context {} failed.", context, throwable);
       throw throwable;
     } finally {
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationEndedEvent.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationEndedEvent.java
new file mode 100644
index 00000000..0c9ae107
--- /dev/null
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationEndedEvent.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.pack.omega.transaction.tcc.events;
+
+import org.apache.servicecomb.pack.common.TransactionStatus;
+
+public class ParticipationEndedEvent
+{
+    private final String globalTxId;
+    private final String localTxId;
+    private final String parentTxId;
+    private final String confirmMethod;
+    private final String cancelMethod;
+    private final TransactionStatus status;
+
+    public ParticipationEndedEvent(String globalTxId, String localTxId, String parentTxId,
+                                   String confirmMethod, String cancelMethod, TransactionStatus status) {
+        this.globalTxId = globalTxId;
+        this.localTxId = localTxId;
+        this.parentTxId = parentTxId;
+        this.confirmMethod = confirmMethod;
+        this.cancelMethod = cancelMethod;
+        this.status = status;
+    }
+
+    public String getGlobalTxId() {
+        return globalTxId;
+    }
+
+    public String getLocalTxId() {
+        return localTxId;
+    }
+
+    public String getParentTxId() {
+        return parentTxId;
+    }
+
+    public String getConfirmMethod() {
+        return confirmMethod;
+    }
+
+    public String getCancelMethod() {
+        return cancelMethod;
+    }
+
+    public TransactionStatus getStatus() {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return "ParticipationStartedEvent{" +
+                "globalTxId='" + globalTxId + '\'' +
+                ", localTxId='" + localTxId + '\'' +
+                ", parentTxId='" + parentTxId + '\'' +
+                ", confirmMethod='" + confirmMethod + '\'' +
+                ", cancelMethod='" + cancelMethod + '\'' +
+                ", status=" + status +
+                '}';
+    }
+}
diff --git a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipatedEvent.java b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationStartedEvent.java
similarity index 80%
rename from omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipatedEvent.java
rename to omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationStartedEvent.java
index 701509d3..4c944b02 100644
--- a/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipatedEvent.java
+++ b/omega/omega-transaction/src/main/java/org/apache/servicecomb/pack/omega/transaction/tcc/events/ParticipationStartedEvent.java
@@ -16,27 +16,22 @@
  */
 package org.apache.servicecomb.pack.omega.transaction.tcc.events;
 
-
-import org.apache.servicecomb.pack.common.TransactionStatus;
-
-public class ParticipatedEvent {
+public class ParticipationStartedEvent {
   
   private final String globalTxId;
   private final String localTxId;
   private final String parentTxId;
   private final String confirmMethod;
   private final String cancelMethod;
-  private final TransactionStatus status;
 
 
-  public ParticipatedEvent(String globalTxId, String localTxId, String parentTxId, String confirmMethod,
-      String cancelMethod, TransactionStatus status) {
+  public ParticipationStartedEvent(String globalTxId, String localTxId, String parentTxId,
+                                   String confirmMethod, String cancelMethod) {
     this.globalTxId = globalTxId;
     this.localTxId = localTxId;
     this.parentTxId = parentTxId;
     this.confirmMethod = confirmMethod;
     this.cancelMethod = cancelMethod;
-    this.status = status;
   }
 
   public String getGlobalTxId() {
@@ -59,19 +54,14 @@ public String getCancelMethod() {
     return cancelMethod;
   }
 
-  public TransactionStatus getStatus() {
-    return status;
-  }
-
   @Override
   public String toString() {
-    return "ParticipatedEvent{" +
+    return "ParticipationStartedEvent{" +
         "globalTxId='" + globalTxId + '\'' +
         ", localTxId='" + localTxId + '\'' +
         ", parentTxId='" + parentTxId + '\'' +
         ", confirmMethod='" + confirmMethod + '\'' +
         ", cancelMethod='" + cancelMethod + '\'' +
-        ", status=" + status +
         '}';
   }
 }
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/CoordinateMessageHandlerTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/CoordinateMessageHandlerTest.java
index ca2879e2..5f72fb0d 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/CoordinateMessageHandlerTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/CoordinateMessageHandlerTest.java
@@ -28,10 +28,7 @@
 import org.apache.servicecomb.pack.omega.context.CallbackContext;
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -61,7 +58,12 @@ public String target() {
     }
 
     @Override
-    public AlphaResponse participate(ParticipatedEvent participateEvent) {
+    public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+      return null;
+    }
+
+    @Override
+    public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
       return null;
     }
 
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspectTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspectTest.java
index da194915..3c510a03 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspectTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccParticipatorAspectTest.java
@@ -31,10 +31,7 @@
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.annotations.Participate;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.junit.Before;
@@ -48,7 +45,8 @@
   private final String localTxId = UUID.randomUUID().toString();
   private final String newLocalTxId = UUID.randomUUID().toString();
 
-  private final List<ParticipatedEvent> participatedEvents = new ArrayList<>();
+  private final List<ParticipationStartedEvent> participationStartedEvents = new ArrayList<>();
+  private final List<ParticipationEndedEvent> participationEndedEvents = new ArrayList<>();
   private final AlphaResponse response = new AlphaResponse(false);
   private String confirmMethod;
   private String cancelMethod;
@@ -74,8 +72,14 @@ public String target() {
     }
 
     @Override
-    public AlphaResponse participate(ParticipatedEvent participateEvent) {
-      participatedEvents.add(participateEvent);
+    public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+      participationStartedEvents.add(participationStartedEvent);
+      return response;
+    }
+
+    @Override
+    public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
+      participationEndedEvents.add(participationEndedEvent);
       return response;
     }
 
@@ -127,15 +131,15 @@ public void setUp() throws Exception {
   public void participateMethodIsCalledSuccessed() throws Throwable {
     aspect.advise(joinPoint, participate);
 
-    assertThat(participatedEvents.size(), is(1));
-    ParticipatedEvent participatedEvent = participatedEvents.get(0);
+    assertThat(participationStartedEvents.size(), is(1));
+    ParticipationStartedEvent participationStartedEvent = participationStartedEvents.get(0);
 
-    assertThat(participatedEvent.getGlobalTxId(), is(globalTxId));
-    assertThat(participatedEvent.getParentTxId(), is(localTxId));
-    assertThat(participatedEvent.getLocalTxId(), is(newLocalTxId));
-    assertThat(participatedEvent.getStatus(), is(TransactionStatus.Succeed));
-    assertThat(participatedEvent.getCancelMethod(), is(cancelMethod));
-    assertThat(participatedEvent.getConfirmMethod(), is(confirmMethod));
+    assertThat(participationStartedEvent.getGlobalTxId(), is(globalTxId));
+    assertThat(participationStartedEvent.getParentTxId(), is(localTxId));
+    assertThat(participationStartedEvent.getLocalTxId(), is(newLocalTxId));
+//    assertThat(participationStartedEvent.getStatus(), is(TransactionStatus.Succeed));
+//    assertThat(participationStartedEvent.getCancelMethod(), is(cancelMethod));
+//    assertThat(participationStartedEvent.getConfirmMethod(), is(confirmMethod));
 
     assertThat(omegaContext.globalTxId(), is(globalTxId));
     assertThat(omegaContext.localTxId(), is(localTxId));
@@ -154,15 +158,15 @@ public void participateMethodIsCalledFailed()  throws Throwable {
       assertThat(e, is(oops));
     }
 
-    assertThat(participatedEvents.size(), is(1));
-    ParticipatedEvent participatedEvent = participatedEvents.get(0);
+    assertThat(participationStartedEvents.size(), is(1));
+    ParticipationStartedEvent participationStartedEvent = participationStartedEvents.get(0);
 
-    assertThat(participatedEvent.getGlobalTxId(), is(globalTxId));
-    assertThat(participatedEvent.getParentTxId(), is(localTxId));
-    assertThat(participatedEvent.getLocalTxId(), is(newLocalTxId));
-    assertThat(participatedEvent.getStatus(), is(TransactionStatus.Failed));
-    assertThat(participatedEvent.getCancelMethod(), is(cancelMethod));
-    assertThat(participatedEvent.getConfirmMethod(), is(confirmMethod));
+    assertThat(participationStartedEvent.getGlobalTxId(), is(globalTxId));
+    assertThat(participationStartedEvent.getParentTxId(), is(localTxId));
+    assertThat(participationStartedEvent.getLocalTxId(), is(newLocalTxId));
+//    assertThat(participationStartedEvent.getStatus(), is(TransactionStatus.Failed));
+//    assertThat(participationStartedEvent.getCancelMethod(), is(cancelMethod));
+//    assertThat(participationStartedEvent.getConfirmMethod(), is(confirmMethod));
 
 
     assertThat(omegaContext.globalTxId(), is(globalTxId));
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAnnotationProcessorTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAnnotationProcessorTest.java
index 96d0de6c..560f6525 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAnnotationProcessorTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAnnotationProcessorTest.java
@@ -33,10 +33,7 @@
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
 import org.apache.servicecomb.pack.omega.transaction.OmegaException;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.hamcrest.core.Is;
 import org.junit.Assert;
 import org.junit.Before;
@@ -75,7 +72,12 @@ public String target() {
     }
 
     @Override
-    public AlphaResponse participate(ParticipatedEvent participateEvent) {
+    public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+      return null;
+    }
+
+    @Override
+    public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
       return null;
     }
 
diff --git a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAspectTest.java b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAspectTest.java
index 2572c72b..83f2827c 100644
--- a/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAspectTest.java
+++ b/omega/omega-transaction/src/test/java/org/apache/servicecomb/pack/omega/transaction/tcc/TccStartAspectTest.java
@@ -32,10 +32,7 @@
 import org.apache.servicecomb.pack.omega.context.OmegaContext;
 import org.apache.servicecomb.pack.omega.context.annotations.TccStart;
 import org.apache.servicecomb.pack.omega.transaction.AlphaResponse;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.CoordinatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.ParticipatedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccEndedEvent;
-import org.apache.servicecomb.pack.omega.transaction.tcc.events.TccStartedEvent;
+import org.apache.servicecomb.pack.omega.transaction.tcc.events.*;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.reflect.MethodSignature;
 import org.junit.Before;
@@ -71,7 +68,12 @@ public String target() {
     }
 
     @Override
-    public AlphaResponse participate(ParticipatedEvent participateEvent) {
+    public AlphaResponse participationStart(ParticipationStartedEvent participationStartedEvent) {
+      return null;
+    }
+
+    @Override
+    public AlphaResponse participationEnd(ParticipationEndedEvent participationEndedEvent) {
       return null;
     }
 
diff --git a/pack-contracts/pack-contract-grpc/src/main/proto/GrpcTccEvent.proto b/pack-contracts/pack-contract-grpc/src/main/proto/GrpcTccEvent.proto
index 20edad45..73fbbde8 100644
--- a/pack-contracts/pack-contract-grpc/src/main/proto/GrpcTccEvent.proto
+++ b/pack-contracts/pack-contract-grpc/src/main/proto/GrpcTccEvent.proto
@@ -26,7 +26,8 @@ import "GrpcCommon.proto";
 service TccEventService {
   rpc OnConnected (GrpcServiceConfig) returns (stream GrpcTccCoordinateCommand) {
   }
-  rpc participate(GrpcTccParticipatedEvent) returns (GrpcAck) {}
+  rpc OnParticipationStarted(GrpcParticipationStartedEvent) returns (GrpcAck) {}
+  rpc OnParticipationEnded(GrpcParticipationEndedEvent) returns (GrpcAck) {}
   rpc OnTccTransactionStarted (GrpcTccTransactionStartedEvent) returns (GrpcAck) {}
   rpc OnTccTransactionEnded (GrpcTccTransactionEndedEvent) returns (GrpcAck) {}
   rpc OnTccCoordinated(GrpcTccCoordinatedEvent) returns(GrpcAck) {}
@@ -43,7 +44,18 @@ message GrpcTccTransactionStartedEvent {
   string instanceId = 6;
 }
 
-message GrpcTccParticipatedEvent {
+message GrpcParticipationStartedEvent {
+  int64 timestamp = 1;
+  string globalTxId = 2;
+  string localTxId = 3;
+  string parentTxId = 4;
+  string serviceName = 5;
+  string instanceId = 6;
+  string confirmMethod = 7;
+  string cancelMethod = 8;
+}
+
+message GrpcParticipationEndedEvent {
   int64 timestamp = 1;
   string globalTxId = 2;
   string localTxId = 3;


With regards,
Apache Git Services