Giter Site home page Giter Site logo

actiontech / txle Goto Github PK

View Code? Open in Web Editor NEW
43.0 8.0 21.0 9.22 MB

Distributed Transaction Solution. Guarantee Eventually Data Consistency.

Home Page: https://opensource.actionsky.com

License: Apache License 2.0

Makefile 0.09% Java 94.24% TSQL 2.47% Shell 2.97% Dockerfile 0.22%

txle's Introduction

txle logo

txle | 中文 License Gitter

txle is a distributed transaction solution and can guarantee the final consistency of the business data.

Feature

  • Multiple ways to guarantee the final consistency of the business data.
  • High performance. The impact of a single branch transaction on business performance is around 2ms.
  • Low invasion. It can work by setting 2 annotations.
  • Support quick start by Docker.
  • Support service downgrading. No effect to main business in case of irresistible factors.
  • Support for exception snapshot processing.
  • Support both timeout and retry.

Architecture

txle architecture

Quick Start

Follow instructions in QuickStart.md.
Please refer to the Chinese documentation for more details.

History

txle is based on ServiceComb Pack. First of all, thanks to the contributors from ServiceComb Pack.

For txle, more attention on financial field and it can work in a lot of complex business cases. Moreover, there were significant improvements on Stability and Performance, especially the QPS, it was increased for several times.

Community

  • QQ group: 696990638
  • WeChat Subscription QR code
    txle

Contribution

Contributions are welcomed and greatly appreciated. See CONTRIBUTION.md for details on submitting patches and the contribution workflow.

txle's People

Contributors

anny1021 avatar asifdxtreme avatar asiroliu avatar chanjarster avatar crystaldust avatar david0825 avatar eric-lee-ltk avatar geektjs avatar ikarishinjieva avatar imlijinting avatar jeremyxu2010 avatar jiuang avatar lijasonvip avatar lionelpang avatar lium200309 avatar liuzhenyang avatar mabingo avatar oliugian avatar seanyinx avatar singlex avatar tanktian avatar tuohai666 avatar venjiang avatar willemjiang avatar withlin avatar yangbor avatar yanhuqing666 avatar zhang2014 avatar zhanglongchun avatar zhfeng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

txle's Issues

[risk][Compensable][retries]When the set retries value is less than -1, there is a risk of overflow

Describe The Bug

When the set retries value is less than -1, the retries value is always reduced , there is a risk of overflow

TXLE Version

https://github.com/actiontech/txle/commit/6bd946510f1515943e46c135d37eb1f183f30673

To Reproduce

Steps to reproduce the behavior:

  1. The first sub-transaction annotation Compensable parameter retries = -2147483648
    image
  2. Trigger the first sub-transaction exception, causing the retry event

Real Result

retries overflow
image

Suggestion

Less than 0, unlimited retry;
Equal to 0, do not retry;
Greater than 0, retry n times;

[issue][Compensable][timeout]global service set timeout,when all sub-services are complete and global service timeout, the result is unstable

Describe The Bug

global service set timeout,when all sub-services are complete and global service timeout, the result is unstable

TXLE Version

./txle -v
txle version 9.9.9.9 d2249e2df2dff0eff68b7f4bea37ba4887d8e2ca

To Reproduce

Steps to reproduce the behavior:

  1. set global service timeout to 3 secs
    @SagaStart(category = "txle-springboot-global", timeout = 3)
    @GetMapping("/testGlobalTransactionGlobalTimeout_3/{userId}/{amount}/{merchantid}")
    public String testGlobalTransactionGlobalTimeout_3(@PathVariable int userId, @PathVariable double amount, @PathVariable int merchantid) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        System.err.println("[" + sdf.format(new Date()) + "] Executing method '" + this.getClass() + ".testGlobalTransactionGlobalTimeout_3'. \t\tParameters[userId = " + userId + ", amount = " + amount + ", merchantid = " + merchantid + "]");

        try {
            // 1.扣款
            restTemplate.postForObject(userServiceUrl + "/deductMoneyFromUser/{userId}/{balance}", null, String.class, userId, amount);


            // 2.汇款
            restTemplate.postForObject(merchantServiceUrl + "/payMoneyToMerchant/{merchantid}/{balance}", null, String.class, merchantid, amount);

            try {
                Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return TxleConstants.OK;
        } catch (Exception e) {
            throw e;
        }
    }
  1. send http request trigger the global service

Expected Result

the global service should be successful, and not roll back the data

Real Result

the global service response is failed(500 Internal Server Error), and roll back the data

Logs

serviceName creationTime type
sample-txle-springboot-user 2020/4/7 06:32:04 TxStartedEvent
sample-txle-springboot-user 2020/4/7 06:32:04 TxEndedEvent
sample-txle-springboot-merchant 2020/4/7 06:32:04 TxStartedEvent
sample-txle-springboot-merchant 2020/4/7 06:32:04 TxEndedEvent
sample-txle-springboot-global 2020/4/7 06:32:09 TxAbortedEvent
sample-txle-springboot-user 2020/4/7 06:32:09 TxCompensatedEvent
sample-txle-springboot-merchant 2020/4/7 06:32:09 TxCompensatedEvent
sample-txle-springboot-global 2020/4/7 06:32:10 SagaEndedEvent

[Improve][Compensable][compensationMethod]set the value of compensationMethod to empty, the alpha-server throw exception when triggering compensation

Describe The Bug

set the value of compensationMethod to empty, the alpha-server throw exception when triggering compensation

TXLE Version

https://github.com/actiontech/txle/commit/6bd946510f1515943e46c135d37eb1f183f30673

To Reproduce

Steps to reproduce the behavior:

  1. The first sub-transaction annotation Compensable's parameter compensationMethod uses the default value or is set to an empty string
    image
  2. Trigger the second sub-transaction exception, causing compensation event

Expected Result

Refer to the implementation of the compensation method when the value of compensationMethod is set to a non-existent compensation function. throw exception when application start

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' defined in file [/Users/liuan/workspace/JAVA/utx-sample/saga-eureka-provider1/target/classes/com/gannalyo/saga/user_provider1/service/UserService.class]: Initialization of bean failed; nested exception is org.apache.servicecomb.saga.omega.transaction.OmegaException: No such compensation method [updateMoneyByUserId_rollback_wrong] found in com.gannalyo.saga.user_provider1.service.UserService

Real Result

alpha-server error log

[ ERROR ] [2018-11-06 14:11:48.504][grpc-default-executor-2][ERROR][io.grpc.internal.SerializingExecutor][126]:Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@5f6bda50
 io.grpc.StatusRuntimeException: CANCELLED: call already cancelled
 at io.grpc.Status.asRuntimeException(Status.java:517) ~[grpc-core-1.14.0.jar:1.14.0]
 at io.grpc.stub.ServerCalls$ServerCallStreamObserverImpl.onCompleted(ServerCalls.java:356) ~[grpc-stub-1.14.0.jar:1.14.0]
 at org.apache.servicecomb.saga.alpha.server.GrpcOmegaCallback.disconnect(GrpcOmegaCallback.java:53) ~[classes/:?]
 at org.apache.servicecomb.saga.alpha.server.GrpcTxEventEndpointImpl.onDisconnected(GrpcTxEventEndpointImpl.java:70) ~[classes/:?]
 at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$MethodHandlers.invoke(TxEventServiceGrpc.java:350) ~[classes/:?]
 at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:171) ~[grpc-stub-1.14.0.jar:1.14.0]
 at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:283) ~[grpc-core-1.14.0.jar:1.14.0]
 at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:707) ~[grpc-core-1.14.0.jar:1.14.0]
 at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.14.0.jar:1.14.0]
 at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) [grpc-core-1.14.0.jar:1.14.0]
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
 at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]

[issue][AutoCompensable]the AutoCompensable can not roll back multi sql update one record in the same sub-service

Describe The Bug

the AutoCompensable can not roll back multi sql update one record in the same sub-service

TXLE Version

https://github.com/actiontech/txle/commit/09c33a59cf339d31a05c9fdf1640a5dcb049c388

To Reproduce

Steps to reproduce the behavior:

  1. execute twice sql in the same sub-service with @AutoCompensable
    @Transactional
    @AutoCompensable
    public int updateBalanceByUserId_auto_nested(@Param("userId") long userId, @Param("balance") double balance) {
        if (userRepository.updateBalanceByUserId(userId, balance) < 1) {
            throw new RuntimeException("Sorry, not sufficient balance under your account.");
        }
         if (userRepository.updateBalanceByUserId(userId, balance) < 1) {
            throw new RuntimeException("Sorry, not sufficient balance under your account.");
        }
        return 1;
    }
  1. trigger AutoCompensable

Expected Result

  1. TXLE roll back all transactions and the final result is consistent.

Real Result

  1. TXLE only roll back one update sql, but there are tow update sql

[AutoCompensable]The sub-transaction adds the @AutoCompensable. When the application throw exception,the alpha server logs an error.

Describe The Bug

The sub-transaction adds the @AutoCompensable. When the application throw exception,the alpha server logs an error.

TXLE Version

https://github.com/actiontech/txle/commit/f5e23fa623361e01777603d21ed08ed58f5977e8

To Reproduce

Steps to reproduce the behavior:

  1. The sub-transaction adds the @AutoCompensable
  2. Trigger the second sub-transaction throw exception, causing compensated event

Expected Result

trigger compensation event success

Real Result

alpha server logs error

Logs

[ INFO ] [2018-11-20 16:08:09.730][main][INFO][org.springframework.boot.StartupInfoLogger][57]:Started AlphaApplication in 10.781 seconds (JVM running for 12.833)
[ WARN ] [2018-11-20 16:13:09.199][grpc-default-executor-1][WARN][org.eclipse.persistence.logging.JavaLog][300]:
 org.eclipse.persistence.exceptions.DatabaseException: 
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
Error Code: 1406
Call: INSERT INTO TxEvent (CATEGORY, COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	bind => [13 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-eureka-provider2', instanceId='saga-eureka-provider2-192.168.2.224', creationTime=Tue Nov 20 16:13:09 CST 2018, globalTxId='f7381afc-7ce4-4d30-9626-6d856dc539ec', localTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', parentTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', type='TxAbortedEvent', compensationMethod='public boolean org.apache.servicecomb.saga.omega.transaction.AutoCompensateService.executeAutoCompensateByLocalTxId(java.lang.String,java.lang.String)', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', category='java.lang.RuntimeException: 哎呀!!!金额太大了。。。请不要超过 100 大洋!!!
	at com.gannalyo.saga.user_provider2.service.UserService.updateMoneyByUserId_auto(UserService.java:41)
	at com.gannalyo.saga.user_provider2.service.UserService$$FastClassBySpringCGLIB$$666e190.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableRecovery.apply(AutoCompensableRecovery.java:59)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableAspect.advise(AutoCompensableAspect.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)
	at com.gannalyo.saga.user_provider2.service.UserService$$EnhancerBySpringCGLIB$$e2e7ba01.updateMoneyByUserId_auto(<generated>)
	at com.gannalyo.saga.user_provider2.controller.UserController.updateMoneyByUserId_auto(UserController.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
', retries=0})
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:905) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:967) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:637) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:564) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2093) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:309) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:270) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:256) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:405) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:502) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:314) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:810) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2979) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:227) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:126) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4384) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1491) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1581) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:278) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1218) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:134) ~[org.eclipse.persistence.jpa-2.7.1.jar:?]
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:518) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.apache.servicecomb.saga.alpha.core.UtxJpaRepositoryInterceptor.doFilter(UtxJpaRepositoryInterceptor.java:20) ~[classes/:?]
	at org.apache.servicecomb.saga.alpha.core.UtxJpaRepositoryProxyFactory.lambda$null$0(UtxJpaRepositoryProxyFactory.java:20) ~[classes/:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) [spring-data-jpa-1.11.13.RELEASE.jar:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) [spring-data-commons-1.13.13.RELEASE.jar:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) [spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.apache.servicecomb.saga.alpha.server.$Proxy109.save(Unknown Source) [?:?]
	at org.apache.servicecomb.saga.alpha.server.SpringTxEventRepository.save(SpringTxEventRepository.java:40) [classes/:?]
	at org.apache.servicecomb.saga.alpha.core.TxConsistentService.handleSupportTxPause(TxConsistentService.java:79) [classes/:?]
	at org.apache.servicecomb.saga.alpha.server.GrpcTxEventEndpointImpl.onTxEvent(GrpcTxEventEndpointImpl.java:79) [classes/:?]
	at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$MethodHandlers.invoke(TxEventServiceGrpc.java:346) [classes/:?]
	at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:171) [grpc-stub-1.14.0.jar:1.14.0]
	at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:283) [grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:707) [grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) [grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) [grpc-core-1.14.0.jar:1.14.0]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3974) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
	at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.31.jar:?]
	at com.sun.proxy.$Proxy120.executeUpdate(Unknown Source) ~[?:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	... 63 more
[ ERROR ] [2018-11-20 16:13:09.224][grpc-default-executor-1][ERROR][io.grpc.internal.SerializingExecutor][126]:Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@7486c7ed
 org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
Error Code: 1406
Call: INSERT INTO TxEvent (CATEGORY, COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	bind => [13 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-eureka-provider2', instanceId='saga-eureka-provider2-192.168.2.224', creationTime=Tue Nov 20 16:13:09 CST 2018, globalTxId='f7381afc-7ce4-4d30-9626-6d856dc539ec', localTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', parentTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', type='TxAbortedEvent', compensationMethod='public boolean org.apache.servicecomb.saga.omega.transaction.AutoCompensateService.executeAutoCompensateByLocalTxId(java.lang.String,java.lang.String)', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', category='java.lang.RuntimeException: 哎呀!!!金额太大了。。。请不要超过 100 大洋!!!
	at com.gannalyo.saga.user_provider2.service.UserService.updateMoneyByUserId_auto(UserService.java:41)
	at com.gannalyo.saga.user_provider2.service.UserService$$FastClassBySpringCGLIB$$666e190.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableRecovery.apply(AutoCompensableRecovery.java:59)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableAspect.advise(AutoCompensableAspect.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)
	at com.gannalyo.saga.user_provider2.service.UserService$$EnhancerBySpringCGLIB$$e2e7ba01.updateMoneyByUserId_auto(<generated>)
	at com.gannalyo.saga.user_provider2.controller.UserController.updateMoneyByUserId_auto(UserController.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
', retries=0})
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:518) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) ~[spring-tx-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.apache.servicecomb.saga.alpha.core.UtxJpaRepositoryInterceptor.doFilter(UtxJpaRepositoryInterceptor.java:20) ~[classes/:?]
	at org.apache.servicecomb.saga.alpha.core.UtxJpaRepositoryProxyFactory.lambda$null$0(UtxJpaRepositoryProxyFactory.java:20) ~[classes/:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) ~[spring-data-jpa-1.11.13.RELEASE.jar:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-1.13.13.RELEASE.jar:?]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	at org.apache.servicecomb.saga.alpha.server.$Proxy109.save(Unknown Source) ~[?:?]
	at org.apache.servicecomb.saga.alpha.server.SpringTxEventRepository.save(SpringTxEventRepository.java:40) ~[classes/:?]
	at org.apache.servicecomb.saga.alpha.core.TxConsistentService.handleSupportTxPause(TxConsistentService.java:79) ~[classes/:?]
	at org.apache.servicecomb.saga.alpha.server.GrpcTxEventEndpointImpl.onTxEvent(GrpcTxEventEndpointImpl.java:79) ~[classes/:?]
	at org.apache.servicecomb.saga.pack.contract.grpc.TxEventServiceGrpc$MethodHandlers.invoke(TxEventServiceGrpc.java:346) ~[classes/:?]
	at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:171) ~[grpc-stub-1.14.0.jar:1.14.0]
	at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:283) ~[grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:707) ~[grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) ~[grpc-core-1.14.0.jar:1.14.0]
	at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123) [grpc-core-1.14.0.jar:1.14.0]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
Error Code: 1406
Call: INSERT INTO TxEvent (CATEGORY, COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	bind => [13 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-eureka-provider2', instanceId='saga-eureka-provider2-192.168.2.224', creationTime=Tue Nov 20 16:13:09 CST 2018, globalTxId='f7381afc-7ce4-4d30-9626-6d856dc539ec', localTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', parentTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', type='TxAbortedEvent', compensationMethod='public boolean org.apache.servicecomb.saga.omega.transaction.AutoCompensateService.executeAutoCompensateByLocalTxId(java.lang.String,java.lang.String)', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', category='java.lang.RuntimeException: 哎呀!!!金额太大了。。。请不要超过 100 大洋!!!
	at com.gannalyo.saga.user_provider2.service.UserService.updateMoneyByUserId_auto(UserService.java:41)
	at com.gannalyo.saga.user_provider2.service.UserService$$FastClassBySpringCGLIB$$666e190.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableRecovery.apply(AutoCompensableRecovery.java:59)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableAspect.advise(AutoCompensableAspect.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)
	at com.gannalyo.saga.user_provider2.service.UserService$$EnhancerBySpringCGLIB$$e2e7ba01.updateMoneyByUserId_auto(<generated>)
	at com.gannalyo.saga.user_provider2.controller.UserController.updateMoneyByUserId_auto(UserController.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
', retries=0})
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:159) ~[org.eclipse.persistence.jpa-2.7.1.jar:?]
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	... 31 more
Caused by: org.eclipse.persistence.exceptions.DatabaseException: 
Internal Exception: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
Error Code: 1406
Call: INSERT INTO TxEvent (CATEGORY, COMPENSATIONMETHOD, CREATIONTIME, EXPIRYTIME, GLOBALTXID, INSTANCEID, LOCALTXID, PARENTTXID, PAYLOADS, RETRIES, RETRYMETHOD, SERVICENAME, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	bind => [13 parameters bound]
Query: InsertObjectQuery(TxEvent{surrogateId=-1, serviceName='saga-eureka-provider2', instanceId='saga-eureka-provider2-192.168.2.224', creationTime=Tue Nov 20 16:13:09 CST 2018, globalTxId='f7381afc-7ce4-4d30-9626-6d856dc539ec', localTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', parentTxId='d17d719c-1dad-4c2e-9c7e-8a31e3d9425d', type='TxAbortedEvent', compensationMethod='public boolean org.apache.servicecomb.saga.omega.transaction.AutoCompensateService.executeAutoCompensateByLocalTxId(java.lang.String,java.lang.String)', expiryTime=Fri Dec 31 08:00:00 CST 9999, retryMethod='', category='java.lang.RuntimeException: 哎呀!!!金额太大了。。。请不要超过 100 大洋!!!
	at com.gannalyo.saga.user_provider2.service.UserService.updateMoneyByUserId_auto(UserService.java:41)
	at com.gannalyo.saga.user_provider2.service.UserService$$FastClassBySpringCGLIB$$666e190.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableRecovery.apply(AutoCompensableRecovery.java:59)
	at org.apache.servicecomb.saga.omega.transaction.AutoCompensableAspect.advise(AutoCompensableAspect.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)
	at com.gannalyo.saga.user_provider2.service.UserService$$EnhancerBySpringCGLIB$$e2e7ba01.updateMoneyByUserId_auto(<generated>)
	at com.gannalyo.saga.user_provider2.controller.UserController.updateMoneyByUserId_auto(UserController.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
', retries=0})
	at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:905) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:967) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:637) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:564) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2093) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:309) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:270) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:256) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:405) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:502) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:314) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:810) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2979) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:227) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:126) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4384) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1491) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1581) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:278) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1218) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:134) ~[org.eclipse.persistence.jpa-2.7.1.jar:?]
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	... 31 more
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'category' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3974) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998) ~[mysql-connector-java-5.1.46.jar:5.1.46]
	at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
	at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.31.jar:?]
	at com.sun.proxy.$Proxy120.executeUpdate(Unknown Source) ~[?:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:895) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:967) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:637) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:564) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.basicExecuteCall(AbstractSession.java:2093) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.sessions.server.ClientSession.executeCall(ClientSession.java:309) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:270) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:256) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:405) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:165) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:180) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:502) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommit(InsertObjectQuery.java:80) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.InsertObjectQuery.executeCommitWithChangeSet(InsertObjectQuery.java:90) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.queries.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:314) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:58) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:911) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:810) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:108) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.queries.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:85) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2979) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1892) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1874) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1824) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:227) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:126) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:4384) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1491) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1581) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:278) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1218) ~[org.eclipse.persistence.core-2.7.1.jar:?]
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:134) ~[org.eclipse.persistence.jpa-2.7.1.jar:?]
	at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
	... 31 more

[issue][txle][restart]when txle is stopped, restart txle but it doesn't work

Describe The Bug

When txle is stopped, restart txle but it doesn't work

TXLE Version

https://github.com/actiontech/txle/commit/2bb2dbc19c030a2eff4770928373ae7bcb758c63

To Reproduce

Steps to reproduce the behavior:

  1. run command ./utx-server.sh stop , make sure txle is stopped
  2. run command ./utx-server.sh restart

Expected Result

alpha-server is running

Real Result

alpha-server is not running

Logs

[root@alpha-server-1 bin]# ./utx-server.sh restart
/usr/java/jdk1.8.0_191-amd64/bin/java
Utx server is restarting ....
ERROR: The Utx has not been started!

[issue][rollback][concurrent]TXLE cannot roll back all timeout transactions

Describe The Bug

In the case of concurrent timeout transactions, TXLE cannot roll back all timeout transactions and the final result is inconsistent.

TXLE Version

https://github.com/actiontech/txle/commit/2bb2dbc19c030a2eff4770928373ae7bcb758c63

To Reproduce

Steps to reproduce the behavior:

  1. use jmeter
Number of Threads: 10
Loop Count: 10
Path: /testGlobalTransactionTimeout/1/2/1

Expected Result

TXLE roll back all timeout transactions and the final result is consistent.
Observing data through prometheus:

key value
utx_transaction_total 100
utx_transaction_successful_total 0
utx_transaction_failed_total global:100
utx_transaction_rollbacked_total 100
utx_transaction_retried_total 0
utx_transaction_timeout_total 100
utx_transaction_child_total user:100
merchant:100
utx_sql_total global:400
user:620

Real Result

  1. the number of utx_transactionRollbacked_total is less than 100
  2. user balance is not roll back to initial value
  3. merchant balance is roll back to initial value
  4. the total number of user balance add merchant balance is less than the initial value

[issue][alpha-server clustering]stop leader alpha-server, cause the global transaction failed

Describe The Bug

stop leader alpha-server, cause the global transaction failed

TXLE Version

https://github.com/actiontech/txle/commit/972b97cd664758ebca31eff09f05d3b7b360169d

To Reproduce

Steps to reproduce the behavior:

  1. install alpha server with clustering mode, and setup consul
  2. use jmeter send http request trigger global transaction forever
  3. stop leader alpha server

Expected Result

all global transaction should be successful and completed.

Real Result

the global transaction is failed, it try to connect alpha server which is stopped.

[time]time is not synchronized,cause timeout doesn't work

Describe The Bug

When the machine running the program and the machine where the database is located are not synchronized, cause timeout doesn't work.

TXLE Version

https://github.com/actiontech/txle/commit/6bd946510f1515943e46c135d37eb1f183f30673

To Reproduce

Steps to reproduce the behavior:

  1. Set the database running server time is 1 minute slower than the alpha server time of the program running
  2. Set the timeout to 1 in @SagaStart and pause 2 seconds in the global transaction

Expected Result

the global transaction is timeout and compensation

Real Result

the global transaction is passed
image

[issue][rollback][concurrent]TXLE cannot roll back all AutoCompensable transactions

Describe The Bug

In the case of concurrent AutoCompensable transactions, TXLE cannot roll back all AutoCompensable transactions and the final result is inconsistent.

TXLE Version

https://github.com/actiontech/txle/commit/2bb2dbc19c030a2eff4770928373ae7bcb758c63

To Reproduce

Steps to reproduce the behavior:

  1. use jmeter
Number of Threads: 10
Loop Count: 10
Path: /testGlobalTransactionAuto/1/2/1

Expected Result

TXLE roll back all AutoCompensable transactions and the final result is consistent.
Observing data through prometheus:

key value
utx_transaction_total 100
utx_transaction_successful_total 100
utx_transaction_failed_total 0
utx_transaction_rollbacked_total 0
utx_transaction_retried_total 0
utx_transaction_timeout_total 0
utx_transaction_child_total user:100
merchant:100
utx_sql_total global:200
user:200
merchant: 200

Real Result

  1. the number of utx_transactionRollbacked_total is less than 100, actual it's 96
  2. the number of utx_transaction_failed_total is 4
  3. the number of utx_transactionRollbacked_total is 2
  4. the total number of user balance add merchant balance reduce 2

[issue][Compensable][timeout]the transaction is timeout and trigger Compensable, but the global service response is 200 OK

Describe The Bug

the transaction is timeout and trigger Compensable, but the global service response is 200 OK.

TXLE Version

09c33a59cf339d31a05c9fdf1640a5dcb049c388

To Reproduce

Steps to reproduce the behavior:

  1. set timeout to 1 sec, whatever in @SagaStart, @Compensable or @AutoCompensable.
  2. coding second service sleep 2 sec.

Expected Result

  1. sub-service timeout, the global service response is failed
  2. data rolled back and all data remains consistent

Real Result

  1. the global service response is 200 OK.
  2. data rolled back and all data remains consistent

[Improve][SagaStart/Compensable/AutoCompensable][timeout]it alway trigger compensate when timeout is set to -1 (a value less than 0)

Describe The Bug

When timeout is set to -1 (a value less than 0), it is necessary to find the unreasonable parameter value when the program is running.

TXLE Version

https://github.com/actiontech/txle/commit/a7f442b8cedaf0d8e3acf559f8584aa661916347

To Reproduce

Steps to reproduce the behavior:

  1. timeout is set to -1
    image
  2. send http request trigger this global transaction

Expected Result

timeout set to -1 is unreasonable

Real Result

the global transaction is always failed
image

[SQL]When TxEvent has a large number of records (200 million+), TXLE has a very slow query(10min+)

Describe The Bug

When TxEvent has a large number of records (200 million+), TXLE has a very slow query(10min+)

TXLE Version

https://github.com/actiontech/txle/commit/3a325a6b395e0c87976c33b945b0a75da3275ab5

To Reproduce

Steps to reproduce the behavior:

  1. the MySQL which used by TXLE open the slow log
  2. execute a long-term stress test through jmeter, making TxEvent record more than 200 million
  3. execute a global timeout transaction
  4. view MySQL slow log as follows:
# Time: 2019-06-17T16:36:30.252103+08:00
# User@Host: root[root] @  [172.20.2.1]  Id:  1550
# Query_time: 1594.290094  Lock_time: 0.000061 Rows_sent: 2  Rows_examined: 168732049
SET timestamp=1560760590;
SELECT t0.SURROGATEID, t0.CATEGORY, t0.COMPENSATIONMETHOD, t0.CREATIONTIME, t0.EXPIRYTIME, t0.GLOBALTXID, t0.INSTANCEID, t0.LOCALTXID, t0.PARENTTXID, t0.PAYLOADS, t0.RETRIES, t0.RETRYMETHOD, t0.SERVICENAME, t0.TYPE FROM TxEvent t0 WHERE ((((t0.GLOBALTXID = '3d6f5e2a-453e-46bc-b72c-91edc4374686') AND (t0.TYPE = 'TxStartedEvent')) AND EXISTS (SELECT 1 FROM TxEvent t1 WHERE ((t1.LOCALTXID = t0.LOCALTXID) AND (t1.TYPE = 'TxEndedEvent'))) ) AND NOT EXISTS (SELECT 1 FROM TxEvent t2 WHERE ((t2.LOCALTXID = t0.LOCALTXID) AND (t2.TYPE = 'TxCompensatedEvent'))) );
# Time: 2019-06-17T16:41:34.120188+08:00
# User@Host: root[root] @  [172.20.2.1]  Id:  1545
# Query_time: 720.991837  Lock_time: 0.000087 Rows_sent: 0  Rows_examined: 253098073
SET timestamp=1560760894;
SELECT * FROM TxEvent t WHERE t.type IN ('TxStartedEvent', 'SagaStartedEvent')   AND t.expiryTime < '2019-06-17 08:29:33.128' AND NOT EXISTS(   SELECT t1.globalTxId FROM TxEvent t1   WHERE t1.globalTxId = t.globalTxId     AND t1.localTxId = t.localTxId     AND t1.type != t.type)  AND NOT EXISTS (SELECT 1 FROM TxEvent t2 WHERE t2.globalTxId = t.globalTxId AND t2.type = 'TxAbortedEvent') /**scanner_sql**/;

Expected Result

the query time should be completed in milliseconds

Real Result

the query time spend hundreds of seconds

[Compensable][retries]The number of executions of the retries is less than the number of times which the retries is set

Describe The Bug

The number of executions of the retries is less than the number of times which the retries is set

TXLE Version

https://github.com/actiontech/txle/commit/0924d042b9e6eaf1710c0ca0eecf6c1884a67f7c

To Reproduce

Steps to reproduce the behavior:

  1. The first sub-transaction annotation set parameter retries is set to 0
  2. Trigger the first sub-transaction throw exception, causing the retry event
  3. The first sub-transaction annotation set parameter retries is set to 1
  4. Trigger the first sub-transaction throw exception, causing the retry event

Expected Result

After setting the retries, it should be the number of extra runs after the sub-transaction is running normally.

Real Result

When retries is set to 1, it is not retried.
image

[issue][AutoCompensable]the parameter `retries` doesn't work

Describe The Bug

the parameter of AutoCompensable retries doesn't work

TXLE Version

https://github.com/actiontech/txle/commit/d1fe0d10d8506f96cfa2017bdc063638e797483c

To Reproduce

Steps to reproduce the behavior:

  1. set sub transaction AutoCompensable's retries to 3
    image
  2. send http request trigger this retry transaction

Expected Result

the sub transaction which set retries is 3, should execute 4 times total

Real Result

the sub transaction which set retries is 3, should execute once

[issue][Compensable/AutoCompensable][timeout]When a sub-transaction times out and throws an exception, the sub-transaction is rolled back more times

Describe The Bug

When a sub-transaction times out and throws an exception, the sub-transaction is rolled back more times.

TXLE Version

https://github.com/actiontech/txle/commit/7b3ef760b722413b8ec42162ff27075eba1e688e

To Reproduce

Steps to reproduce the behavior:

  1. sub-transaction code as follows:
    @Transactional
    @Compensable(timeout = 1, compensationMethod = "updateBalanceById_rollback")
    public int updateBalanceById_Timeout(@Param("userId") long userId, @Param("balance") double balance) {
        int result = merchantRepository.updateBalanceById(userId, balance);
        if (balance == 2) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            throw new RuntimeException("sorry, can not deduct money");
        }
        return result;
    }
  1. run the global transaction

Expected Result

the sub-transaction is rolled back and all data remains consistent

Real Result

the sub-transaction is rolled back twice, the data is inconsistent

[issue][Compensable][timeout][concurrent]timeout rollback sometimes rolls back more times

Describe The Bug

When there is concurrent pressure, the timeout rollback sometimes rolls back once more

TXLE Version

https://github.com/actiontech/txle/commit/7b3ef760b722413b8ec42162ff27075eba1e688e

To Reproduce

Steps to reproduce the behavior:

  1. sub-transaction code as follows:
    @Transactional
    @Compensable(timeout = 1, compensationMethod = "updateBalanceById_rollback")
    public int updateBalanceById_Timeout(@Param("userId") long userId, @Param("balance") double balance) {
        int result = merchantRepository.updateBalanceById(userId, balance);

        if (balance == 2) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
  1. Use jmeter to run timeout transactions
    image
    image

Expected Result

the sub-transaction is rolled back and all data remains consistent

Real Result

  1. some timeout sub-transactions are rolled back twice, resulting in data inconsistency
  2. Txevent table can find that the timeout sub-transaction has two rollback events
    select globalTxId from TxEvent group by globalTxId having count(1) > 12;
    image
    select * from TxEvent where globalTxId = '64884d81-1561-4f82-8257-5bc4faf47d32';
    image
  3. alpha-server log
    stdout.log

[issue][downgraded][AccidentReport]after the system is downgraded, the accident report still work fine.

Describe The Bug

After the system is downgraded, the accident report still work fine.

TXLE Version

https://github.com/actiontech/txle/commit/c344b6bf03cecb8c0a70ac822489d86a15207e56

To Reproduce

Steps to reproduce the behavior:

  1. downgrade configuration accident report
    image
  2. the business code is in the rollback method as follow:
        public int updateMoneyByUserId_rollback(@Param("userId") long userId, @Param("money") long money) {
        int result = userRepository.updateMoneyByUserId(userId, -money);

        JsonObject jsonParams = new JsonObject();
        jsonParams.addProperty("type", AccidentType.ROLLBACK_ERROR.toDescription());
        jsonParams.addProperty("userId", userId);
        jsonParams.addProperty("money", money);
        accidentPlatformService.reportMsgToAccidentPlatform(jsonParams.toString());

        return result;
	}

Expected Result

The value of the utx_report_accident_successful_total should not change after executing a global transaction that trigger rollback

Real Result

The value of the utx_report_accident_successful_total is incremented by 1 after executing a global transaction that trigger rollback

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.