GVKun编程网logo

MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done i...

1

在本文中,我们将为您详细介绍MYSQLStatementviolatesGTIDconsistency:Updatestonon-transactionaltablescanonlybedonei..

在本文中,我们将为您详细介绍MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done i...的相关知识,此外,我们还会提供一些关于13.3.5 LOCK TABLES and UNLOCK TABLES Statements(mysql 5.7)-内容来自官方文档、@types/tabulator-tables 打破 tabulator-tables 导入、a label can only be part of statement and a declaratioin is not a statement、Apache FileUpload的两种上传方式介绍及应用 --> upload file done! --> upload file done!的有用信息。

本文目录一览:

MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done i...

MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done i...

 [2019-04-21 10:17:20] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper:144] Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.

org.springframework.orm.hibernate4.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [HY000]; error code [1785]; Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.; nested exception is org.hibernate.exception.GenericJDBCException: Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
        at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:168)
        at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:685)
        at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:567)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy3580.doUpdate(Unknown Source)
        at com.jeecg.crm.controller.LeadController.doUpdate(LeadController.java:1146)
        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:221)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:747)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:676)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.jeecgframework.core.aop.GZipFilter.doFilter(GZipFilter.java:114)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:150)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1137)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
        at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2511)
        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)
Caused by: org.hibernate.exception.GenericJDBCException: Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
        at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
        at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
        at com.sun.proxy.$Proxy3599.executeUpdate(Unknown Source)
        at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3297)
        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
        at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275)
        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
        at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127)
        at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:325)
        at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
        at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
        at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:559)
        ... 60 more
Caused by: java.sql.SQLException: Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2825)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2459)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2376)
        at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2360)
        at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2843)
        at com.alibaba.druid.filter.FilterAdapter.preparedStatement_executeUpdate(FilterAdapter.java:1091)
        at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeUpdate(FilterEventAdapter.java:491)
        at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeUpdate(FilterChainImpl.java:2841)
        at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeUpdate(PreparedStatementProxyImpl.java:194)
        at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:256)
        at sun.reflect.GeneratedMethodAccessor29420.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
        ... 76 more

 

Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables. org.springframework.orm.hibernate4.HibernateJdbcException - 国际版 Bing
https://cn.bing.com/search?FORM=U227DF&PC=U227&q=Statement+violates+GTID+consistency%3A+Updates+to+non-transactional+tables+can+only+be+done+in+either+autocommitted+statements+or+single-statement+transactions%2C+and+never+in+the+same+statement+as+updates+to+transactional+tables.+org.springframework.orm.hibernate4.HibernateJdbcException

mysql_56_GTID_in_a_nutshell.pdf
https://www.percona.com/sites/default/files/presentations/mysql_56_GTID_in_a_nutshell.pdf

mysql - Should I turn off GTID to fix this error? - Database Administrators Stack Exchange
https://dba.stackexchange.com/questions/189281/should-i-turn-off-gtid-to-fix-this-error/189437

Statement violates GTID consistency · Issue #172 · etianen/django-watson
https://github.com/etianen/django-watson/issues/172

spring batch 3.0.3 get "updates to tables using non-transactional storage engines such as MyISAM " with mysql 5.6 - Stack Overflow
https://stackoverflow.com/questions/29622004/spring-batch-3-0-3-get-updates-to-tables-using-non-transactional-storage-engine

replication - How to troubleshoot, find and fix query Percona 5.6 with error "SQLSTATE[HY000]: General error: 1785 When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1" - Database Administrators Stack Exchange
https://dba.stackexchange.com/questions/102258/how-to-troubleshoot-find-and-fix-query-percona-5-6-with-error-sqlstatehy000

 

Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.; nested exception is org.hibernate.exception.GenericJDBCException: Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables

mysql 使用 GTID 主从复制后出现错误代码 1785 解决方法 - 程序园
http://www.voidcn.com/article/p-ajcjwjuo-sb.html

MySQL :: MySQL 5.6 Reference Manual :: 17.1.4.5 Global Transaction ID Options and Variables
https://dev.mysql.com/doc/refman/5.6/en/replication-options-gtids.html

mysql Statement violates GTID consistency 的坑 - SheaChen - 博客园
http://www.cnblogs.com/canmeng-cn/p/5969188.html

pinpoint-web not supporting mysql/percona enforce_gtid_consistency · Issue #4034 · naver/pinpoint
https://github.com/naver/pinpoint/issues/4034

MySQL 问题:perror (1875),Statement violates GTID consistency - poxiaonie 的博客 - CSDN 博客
https://blog.csdn.net/poxiaonie/article/details/75073161

执行 MySql 更新报错:error code [1785] - Mergades - CSDN 博客
https://blog.csdn.net/mergades/article/details/46808079

13.3.5 LOCK TABLES and UNLOCK TABLES Statements(mysql 5.7)-内容来自官方文档

13.3.5 LOCK TABLES and UNLOCK TABLES Statements(mysql 5.7)-内容来自官方文档

LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...
lock_type: {
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE
}
UNLOCK TABLES

mysql允许client session显示的获取表锁,用于访问表时,与其他session的协作,或者阻止其他session修改表。一个session获取、释放锁都是仅针对自身而言的。一个session不能获取其他session的锁,也不能释放其他session的锁。

 LOCK TABLES 语句显示的为当前session获取表锁。表锁可用于表或视图。需要有LOCK TABLE权限和SELECT权限。

对于视图锁,视图用到的所有表都会自动锁住。如果你使用 LOCK TABLES 显示的锁住某个表,那么该表的触发器中用到的所有表,都会被隐式的锁住(下文有示例)。

 UNLOCK TABLES 语句显示的释放当前session的所有表锁。 LOCK TABLES 语句隐式的释放当前session之前获取的锁。

 UNLOCK TABLES 还用于释放由 FLUSH TABLES WITH READ LOCK (锁住所有数据库的所有表)获取的全局读锁。

表锁是为了防止其他session的不适当的读写操作。一个拥有WRITE锁的session,可以执行表级操作,如 DROP TABLE 或者 TRUNCATE TABLE ,一个拥有READ锁的session,这两个操作是不允许的。

 LOCK TABLE 仅适用于non-TEMPORARY表。

Table Lock Acquisition

 LOCK TABLES 用于获取表锁,通过获取metadata lock来实现。

可用的锁类型如下:

READ [LOCAL] lock:

  • 可以读取表,但是不能写。
  • 多个session,可以同时获取某个表的READ锁。
  • 其他没有显示的获取READ锁的session,也可以读取该表。
  • LOCAL修饰符,使得在当前会话已经持有READ锁时,其他会话可以执行不冲突的插入语句(并发插入)。对于InnoDB表,READ LOCAL和READ是一样的。

[LOW_PRIORITY] WRITE lock:

  • 既可以进行读操作、也可以进行写操作。
  • 仅持有锁的session可以访问表。
  • 当已经有一个session持有该锁时,其他获取锁的请求会阻塞。
  • LOW_PRIORITY不起作用,这是老版本的东西,现在已经弃用了,不生效了。

WRITE锁比READ锁优先级更高,这是为了确保写操作可以尽快的执行。也就是说,一个session已经获取了READ锁,另一个session请求WRITE锁,后续的READ锁请求会阻塞,直到请求WRITE锁的session获取然后又释放WRITE锁后,才会继续READ锁请求的执行(An exception to this policy can occur for small values of the max_write_lock_count system variable)。

一个需要锁的session,必须在一个 LOCK TABLES 语句中获取需要的全部锁。获取锁后,这个session仅可以访问 LOCK TABLES 语句中包含的表。例如:下面的语句中,访问 t2 会报错,因为没有在 LOCK TABLES 语句中锁住该表:

mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table ''t2'' was not locked with LOCK TABLES

 INFORMATION_SCHEMA 数据库中的表是一个例外情况,哪怕在使用了 LOCK TABLES 语句,却未包含时,也可以访问这个数据库中的表。

如果操作某个表时使用的是别名,那么在使用 LOCK TABLES 锁表时,也必须使用相同的别名,否则会报错,示例如下:

mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table ''myalias'' was not locked with LOCK TABLES

相反的,如果 LOCK TABLES 语句使用的是别名,那么在操作此表的SQL中,也必须使用相同的别名,示例如下:

mysql> LOCK TABLE t AS myalias READ;
mysql> SELECT * FROM t;
ERROR 1100: Table ''t'' was not locked with LOCK TABLES
mysql> SELECT * FROM t AS myalias;

注意: LOCK TABLES 和 UNLOCK TABLES 语句用于分区表时,必须锁住整个表,不能仅是单独锁某个分表。

Table Lock Release

当一个session释放表锁时,该session拥有的多个表锁(如果有多个的话)同时释放。session可以显示的释放锁,也可以在某些条件下隐式的释放锁。

  • 使用 UNLOCK TABLES 显示的释放表锁。
  • 如果已经包含了某些锁的session,执行 LOCK TABLES 语句时,那么在新申请的锁被授权之前,现存的锁会隐式的释放掉。
  • 当一个session开启一个事务(例如,使用 START TRANSACTION 语句)时,会执行一个隐式的 UNLOCK TABLES ,释放掉现存的锁。

如果一个session的连接中断,不论是正常中断还是异常中断,server会隐式的释放掉该session(事务的或非事务的)持有的所有锁。客户端重连后,之前的锁也都不在了。如果client有一个激活的事务,那么在连接断开时,server会将事务回滚,客户端重连时,session会以启用 autocommit=1 的状态开始。因为这个原因,客户端可能想要禁用auto-reconnect。当auto-reconnect禁用时,如果连接断开,那么下一条语句执行时会报错。客户端可以探测到这个错误,然后做出合适的反应,如重新获取锁,或重新开始事务。

注意:如果你对一个锁住的表,执行 ALTER TABLE 语句时,这个表会变为解锁状态。当再次执行第二次的 ALTER TABLE 时,则会报错: Table ''tbl_name'' was not locked with LOCK TABLES ,为解决此问题,在第二次的语句前,先执行锁表语句 LOCK TABLES 。

Interaction of Table Locking and Transactions

 LOCK TABLES 和 UNLOCK TABLES 语句与事务的相互影响如下:

  •  LOCK TABLES 不是transaction-safe的,该语句在尝试锁表之前,会隐式的提交任何激活的事务。
  •  UNLOCK TABLES 会隐式的提交任何激活的事务,但仅在已经使用 LOCK TABLES 锁住某些表的情况下,执行该语句,才会如此。例如,在下面的语句之后,执行该语句,不会提交事务:
    FLUSH TABLES WITH READ LOCK;
    START TRANSACTION;
    SELECT ... ;
    UNLOCK TABLES;
  • 开始一个事务,例如使用 START TRANSACTION 语句,会隐式的提交任何当前事务,并释放当前存在的表锁。
  •  FLUSH TABLES WITH READ LOCK 获取一个全局读锁,而不是表锁,所以,不受上述影响。例如 START TRANSACTION 语句不会释放全局读锁。
  • 其他的导致事务隐式提交的语句,不会释放表锁。
  • 在事务型表(如InnoDB表)上正确的使用 LOCK TABLES 和 UNLOCK TABLES 的方法是:使用 SET autocommit = 0 开启事务(注意不是 START TRANSACTION ),然后使用 LOCK TABLES ,直到显示的提交事务后,调用 UNLOCK TABLES 。示例如下:
    SET autocommit=0;
    LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ...
    COMMIT;
    UNLOCK TABLES;
  • 当调用 LOCK TABLES 时,InnoDB使用自己内部的锁,MySQL也使用自己的锁。在下一个commit时,InnoDB会释放自己内部的锁,但是要让MySQL释放锁,必须调用 UNLOCK TABLES 。不要使用 autocommit = 1 ,因为这样InnoDB会在 LOCK TABLES 语句后立即释放其内部的锁,死锁会非常容易出现。
  •  ROLLBACK 不会释放表锁。

LOCK TABLES and Triggers

如果使用 LOCK TABLES 进行了锁表,那么该表的触发器中用到的所有表,都被隐式的锁住:

  • 这些锁,与 LOCK TABLES 获取的表锁,是同时的。
  • 触发器中用到的表,要加什么锁,取决于该表是否只用于读操作。如果是,那么只加一个READ锁就够了,如果不是,那么就需要加一个WRITE锁。
  • 如果一个表,显示的通过 LOCK TABLES 加了READ锁,但是如果在触发器中,该表可能会被修改,那么就会加上WRITE锁,而不是加READ锁。

下面是一个示例。

锁住两个表t1和t2:

 LOCK TABLES t1 WRITE, t2 READ; 

假设t1表有一个触发器,如下:

CREATE TRIGGER t1_a_ins AFTER INSERT ON t1 FOR EACH ROW
BEGIN
  UPDATE t4 SET count = count+1
      WHERE id = NEW.id AND EXISTS (SELECT a FROM t3);
  INSERT INTO t2 VALUES(1, 2);
END;

t1和t2会被锁住,因为它们包含在了 LOCK TABLES 语句中。t3和t4也会被锁,因为触发器用到了它们。

  • t1,WRITE锁。
  • t2,WRITE锁,虽然在 LOCK TABLES 语句中加的是READ锁。发生这种情况是因为,触发器中尝试向t2表中插入数据,所以READ锁转换成了WRITE锁。
  • t3,READ锁。因为在触发器中仅对t3进行了读取操作。
  • t4,WRITE锁。因为在触发器中尝试更新t4的数据。

Table-Locking Restrictions and Conditions

你可以使用 KILL 安全的停止一个正在等待table lock的session。

 LOCK TABLE 和 UNLOCK TABLES 不能用于存储程序,如存储过程,存储函数等。

 performance_schema 数据库中的表不能使用 LOCK TABLES 语句进行锁定,除了 setup_xxx 表。

在 LOCK TABLES 生效时,下面的语句是被禁止执行的:CREATE TABLE、CREATE TABLE ... LIKE、CREATE VIEW、DROP VIEW、stored functions/procedures/events的DDL语句。

对于某些操作来说, mysql 库中的系统表必须是可访问的。例如, HELP 语句需要访问help tables,CONVERT_TZ()需要读取time zone tables。你不需要显示的对这些表进行锁定操作,因为在必要的情况下,server会隐式的对这些表加READ锁。例如下述的这些表:

mysql.help_category
mysql.help_keyword
mysql.help_relation
mysql.help_topic
mysql.proc
mysql.time_zone
mysql.time_zone_leap_second
mysql.time_zone_name
mysql.time_zone_transition
mysql.time_zone_transition_type

如果对这些表,你需要WRITE锁,则要使用 LOCK TABLES 语句显示的锁表。

通常的,你不需要锁表,因为所有的单个的 UPDATE 语句都是原子性的。其他的session不会妨碍语句的执行。

然而,有一些情况是需要进行锁表的:

  • 如果你正在对一些 MyISAM 表进行很多操作,锁表可以使操作更快速。因为直到执行 UNLOCK TABLES 语句,MySQL不会刷新key cache。如果不锁表,那么每一条语句执行完,都会进行key cache的刷新。某些情况,锁表的也会有负面影响,因为对于加了READ锁的表,所有的session都不能对其进行更改,即使是持有锁的session也不可以进行更改;对于加了WRITE锁的表,除了持有锁的session,其他的session对此表都不可访问(读、写均不可以)。
  • 如果你在使用非事务型的表,如果你想确保,在你执行SELECT和UPDATE语句之间,没有其他session会修改这个表,则必须使用 LOCK TABLES 。下面是一个示例,这个示例需要使用使用 LOCK TABLES
    LOCK TABLES trans READ, customer WRITE;
    SELECT SUM(value) FROM trans WHERE customer_id=some_id;
    UPDATE customer
      SET total_value=sum_from_previous_statement
      WHERE customer_id=some_id;
    UNLOCK TABLES;

大多情况下,你可以避免使用 LOCK TABLES ,通过使用相对更新( UPDATE customer SET value=value+new_value )或者 LAST_INSERT_ID() 方法。

你也可以通过如下方法来避免使用 LOCK TABLES :user-level锁方法 GET_LOCK() 和 RELEASE_LOCK()

- - 结束 - -

@types/tabulator-tables 打破 tabulator-tables 导入

@types/tabulator-tables 打破 tabulator-tables 导入

如何解决@types/tabulator-tables 打破 tabulator-tables 导入

安装以下(从 tabulator-tables@4.9.1 开始):

  1. npm install tabulator-tables
  2. npm install @types/tabulator-tables

然后做下面的导入

  1. import Tabulator from ''tabulator-tables'';

导致错误:Module Usage (Error node_modules @types tabulator tables index.d.ts'' is not a module)

改用这个导入

  1. import ''tabulator-tables'';

不输出错误,并允许加载类型信息,但在运行时(例如,在 Angular 12 项目中)实际上不允许访问 Tabulator 对象,从而导致 ReferenceError: Tabulator is not defined 之类的错误。>

解决方法

这是由于 @types/tabulator-tables 中的类型定义文件中缺少默认导出。不幸的是,在上游添加默认导出是不可行的,因为它会破坏现有的代码库。

幸运的是,有一个解决方法,described here:如果您还没有创建一个 index.d.ts 文件,然后添加以下行:

  1. declare module "tabulator-tables" { export = Tabulator; }

(还要确保通过在 index.d.ts 中列出 "files" 文件或确保它与 tsconfig.json 中的 "includes" 中的模式匹配来确保包含 "allowSyntheticDefaultImports": true 文件。您可以还需要在 "compilerOptions" 中设置 parenthesis or brackets.。)

a label can only be part of statement and a declaratioin is not a statement

a label can only be part of statement and a declaratioin is not a statement

参考资料:

  https://stackoverflow.com/questions/18496282/why-do-i-get-a-label-can-only-be-part-of-a-statement-and-a-declaration-is-not-a

问题背景:

  写了一段 code,如下:

#include<stdio.h>

int main()
{
    int a;switch (a) {
        case 0:
            break;
        case 1:
            int aa;
            break;
        case 2:
            break;
        default:
            break;
    }

    return 0;
}

  如上所示 code 编译时候会报错,错误提示 “a label can only be part of statement and a declaratioin is not a statement”。

问题原因:

  引用一段话解释为 “Prior to C99, all declarations had to precede all statements within a block, so it wouldn''t have made sense to have a label on a declaration. C99 relaxed that restriction, permitting declarations and statement to be mixed within a block, but the syntax of a labeled-statement was not changed. – Keith Thompson”。

  翻译过来就是,C99 之前,在一代码块中所有的定义都必须在声明之前,所以,一个标签在定义之前是没有意义的。C99 放宽了这个限制,允许代码块中混合定义、声明,但这这个标签不能在定义之前的限制没有改变。

解决方法:

#include<stdio.h>

int main()
{
    int a;
switch (a) { case 0: break; case 1:; //加一个空的‘;’,标示空声明 int aa; break; case 2: break; default: break; } return 0; }

 

#include<stdio.h>

int main()
{
    int a;
    int aa;    //定义放到 switch 之前
    switch (a) {
        case 0:
            break;
        case 1:
            break;
        case 2:
            break;
        default:
            break;
    }

    return 0;
}

 

Apache FileUpload的两种上传方式介绍及应用 --> upload file done! --> upload file done!

Apache FileUpload的两种上传方式介绍及应用 --> upload file done! --> upload file done!

本文为大家介绍下FileUpload的两种上传方式:Traditional API上传方式/Streaming API上传方式,感兴趣的朋友可以参考下哈,希望可以帮助到你

环境

tomcat5.6

commmons-fileupload-1.3.jar

commmons-io-2.4.jar

JSP

编码:UTF-8

临时文件夹:fileupload/tmp相对于网站根目录

上传文件保存位置:fileupload

Traditional API上传方式

//fileload01.htm

复制代码 代码如下:

File to upload:

to upload the file!

//Traditionalapi.jsp

复制代码 代码如下:

request.setCharacterEncoding("UTF-8");

// file less than 10kb will be store in memory, otherwise in file system.

final int threshold = 10240;

final File tmpDir = new File(getServletContext().getRealPath("/") + "fileupload" + File.separator + "tmp");

final int maxRequestSize = 1024 * 1024 * 4; // 4MB

// Check that we have a file upload request

if(ServletFileUpload.isMultipartContent(request))

{

// Create a factory for disk-based file items.

FileItemFactory factory = new diskFileItemFactory(threshold, tmpDir);

// Create a new file upload handler

ServletFileUpload upload = new ServletFileUpload(factory);

// Set overall request size constraint.

upload.setSizeMax(maxRequestSize);

List items = upload.parseRequest(request); // FileUploadException

for(FileItem item : items)

{

if(item.isFormField()) //regular form field

{

String name = item.getFieldName();

String value = item.getString();

%>

-->

}

else

{ //file upload

String fieldName = item.getFieldName();

String fileName = item.getName();

File uploadedFile = new File(getServletContext().getRealPath("/") +

"fileupload" + File.separator + fieldName + "_" + fileName);

item.write(uploadedFile);

%>

upload file done!

}

}

}

%>

Streaming API上传方式

//fileupload02.htm

复制代码 代码如下:

File to upload:

to upload the file!

//streamingapi.jsp

复制代码 代码如下:

request.setCharacterEncoding("UTF-8");

// Check that we have a file upload request

if(ServletFileUpload.isMultipartContent(request))

{

// Create a new file upload handler

ServletFileUpload upload = new ServletFileUpload();

// Parse the request

FileItemIterator iter = upload.getItemIterator(request);

while(iter.hasNext())

{

FileItemStream item = iter.next();

String fieldName = item.getFieldName();

InputStream is = item.openStream();

if(item.isFormField()) //regular form field

{

%>

-->

}

else

{ //file upload

String fileName = item.getName();

File uploadedFile = new File(getServletContext().getRealPath("/") +

"fileupload" + File.separator + fieldName + "_" + fileName);

OutputStream os = new FileOutputStream(uploadedFile);

// write file to disk and close outputstream.

Streams.copy(is, os, true);

%>

upload file done!

}

}

}

%>

Traditional API vs Streaming API

Streaming API上传速度相对较快。因为它是利用内存保存上传的文件,节省了传统API将文件写入临时文件带来的开销。

可参考:

http://stackoverflow.com/questions/11620432/apache-commons-fileupload-streaming-api

This page describes the Traditional API of the commons fileupload library. The Traditional API is a convenient approach. However, for ultimate performance, you might prefer the faster Streaming API.

http://commons.apache.org/proper/commons-fileupload/using.html

关于MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done i...的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于13.3.5 LOCK TABLES and UNLOCK TABLES Statements(mysql 5.7)-内容来自官方文档、@types/tabulator-tables 打破 tabulator-tables 导入、a label can only be part of statement and a declaratioin is not a statement、Apache FileUpload的两种上传方式介绍及应用 --> upload file done! --> upload file done!的相关知识,请在本站寻找。

本文标签: