• 关于

    事务-自动事务

    的搜索结果

回答

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事务通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 所有find开头的方法为只读,所有查询方法都以find开头 --> <tx:method name="find*" read-only="true" /> <!-- 其余方法如果没有事务的时候,就开启新事务运行该方法,否则使用已有的事务运行该方法 --> <!-- 关闭read-only保证save*,update*,delete*等方法可以修改数据 --> <tx:method name="*" propagation="REQUIRED" read-only="false"/> </tx:attributes> </tx:advice> <!-- 设置com.sx.dao包下及其子包下的类的所有方法都加上txAdvice事务通知切片(主要用于自动实现Hibernate事务的提交回滚等) --> <aop:config> <aop:pointcut id="DaoPointCut" expression="execution(* com.sx.dao..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="DaoPointCut"/> </aop:config>

蛮大人123 2019-12-02 01:51:18 0 浏览量 回答数 0

回答

<!-- myBatis文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 --> <property name="mapperLocations" value="classpath:com/sd/**/mapping/*Mapper.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.sd..*.dao" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 注解方式配置事物 --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 拦截器方式配置事物 --> <!-- PROPAGATION_SUPPORTS: 如果已经存在事务,则加入事务;如果没有事务,则以非事务的方式执行; PROPAGATION_MANDATORY: 使用当前事务, 如果没有, 则抛出异常; PROPAGATION_REQUIRED: 新建事务,如果当前有事务, 则挂起; P ROPAGATION_NOT_SUPPORTED:以非事务的方式执行, 如果当前有事务, 则挂起; PROPAGATION_NEVER:以非事务的方式执行, 如果当前有事务,则抛出异常; +/-Exception</prop> + 表示异常出现时事物提交 - 表示异常出现时事务回滚 --> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="append*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="edit*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="repair" propagation="REQUIRED" /> <tx:method name="delAndRepair" propagation="REQUIRED" /> <tx:method name="get*" propagation="SUPPORTS" /> <tx:method name="find*" propagation="SUPPORTS" /> <tx:method name="load*" propagation="SUPPORTS" /> <tx:method name="search*" propagation="SUPPORTS" /> <tx:method name="datagrid*" propagation="SUPPORTS" /> <tx:method name="*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice> <!----> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.sd..service..*Impl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop:config>

a123456678 2019-12-02 02:11:31 0 浏览量 回答数 0

回答

没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊######我也借用了 ,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!######楼主解决了没有,我也遇到这问题了,同求解决######AOP 配置是?######现在没有问题了,用aop的配置,不要用声明式的事务,就可以了######我也不知道怎么就好了######同求答案######不要用声明式事务就好了,我现在用的就没问题了######试试在Dao层注入sessionFactory,比如 @Repository public class BaseHibernateImpl extends HibernateDaoSupport implements IBaseHibernate { private SessionFactory sessionFactory; @Autowired public void setSessionFacotry(SessionFactory sessionFacotry) { super.setSessionFactory(sessionFacotry); } } ######OpenSessionView是用来减决Hibernate懒加载问题,如果在程序使用了load/iterator等方法时,程序并不会马上向数据库发出SQL,等你在前台页面获取时,此时session已经早就关闭(因为事务一般都是在service层),会出现错误。如果程序没有使用事务,如果在程序中进行了更新删除操作,那么也是不允许的,因为spring中默认事务是只读事务,这样也会出现错误。可以在DAO设置,HibernateTemplate有一个变量可以查看源码。spring中已经自动支持了getCurrentSession(),请不要在Hibernate配置hibernate.current_session_context_class为“Thread”否则也会出错###### 用currentsession就不要在配置文件里配置thread了 而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下 <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">         <property name="sessionFactory" ref="sessionFactory"/>     </bean> <tx:annotation-driven transaction-manager="txManager"/> mybatis事务配置: <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> 需要导入spring-orm(依赖spring-jdbc)包 ######我用的是Spring 4 + Hibernate 5 ,和你版本不一样,答不了 ###### <tx:annotation-driven transaction-manager="transactionManager" /> 上面这句需要加在DispatcherServlet指定的xml中 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     <init-param>       <param-name>contextConfigLocation</param-name>       <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>     </init-param> 加在下面的root xml中,会导致在servlet时调用不到事务管理器 <context-param>     <param-name>contextConfigLocation</param-name>     <param-value>/WEB-INF/spring/root-context.xml</param-value>   </context-param> 之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用 ######这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driven transaction-manager="transactionManager" />放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。######楼主现在怎么解决的能贴出来嘛?我也遇到这个问题######不要用声明式事务就好了,我现在用的就没问题了######我也和你遇到一样的问题了。。。不知道如何接解决啊~~~

kun坤 2020-06-07 08:58:51 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊######我也借用了 ,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!######楼主解决了没有,我也遇到这问题了,同求解决######AOP 配置是?######现在没有问题了,用aop的配置,不要用声明式的事务,就可以了######我也不知道怎么就好了######同求答案######不要用声明式事务就好了,我现在用的就没问题了######试试在Dao层注入sessionFactory,比如 @Repository public class BaseHibernateImpl extends HibernateDaoSupport implements IBaseHibernate { private SessionFactory sessionFactory; @Autowired public void setSessionFacotry(SessionFactory sessionFacotry) { super.setSessionFactory(sessionFacotry); } } ######OpenSessionView是用来减决Hibernate懒加载问题,如果在程序使用了load/iterator等方法时,程序并不会马上向数据库发出SQL,等你在前台页面获取时,此时session已经早就关闭(因为事务一般都是在service层),会出现错误。如果程序没有使用事务,如果在程序中进行了更新删除操作,那么也是不允许的,因为spring中默认事务是只读事务,这样也会出现错误。可以在DAO设置,HibernateTemplate有一个变量可以查看源码。spring中已经自动支持了getCurrentSession(),请不要在Hibernate配置hibernate.current_session_context_class为“Thread”否则也会出错###### 用currentsession就不要在配置文件里配置thread了 而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下 <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">         <property name="sessionFactory" ref="sessionFactory"/>     </bean> <tx:annotation-driven transaction-manager="txManager"/> mybatis事务配置: <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> 需要导入spring-orm(依赖spring-jdbc)包 ######我用的是Spring 4 + Hibernate 5 ,和你版本不一样,答不了 ###### <tx:annotation-driven transaction-manager="transactionManager" /> 上面这句需要加在DispatcherServlet指定的xml中 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     <init-param>       <param-name>contextConfigLocation</param-name>       <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>     </init-param> 加在下面的root xml中,会导致在servlet时调用不到事务管理器 <context-param>     <param-name>contextConfigLocation</param-name>     <param-value>/WEB-INF/spring/root-context.xml</param-value>   </context-param> 之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用 ######这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driven transaction-manager="transactionManager" />放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。######楼主现在怎么解决的能贴出来嘛?我也遇到这个问题######不要用声明式事务就好了,我现在用的就没问题了######我也和你遇到一样的问题了。。。不知道如何接解决啊~~~

montos 2020-05-31 15:08:28 0 浏览量 回答数 0

回答

没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊我也借用了,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!楼主解决了没有,我也遇到这问题了,同求解决AOP配置是?现在没有问题了,用aop的配置,不要用声明式的事务,就可以了我也不知道怎么就好了同求答案不要用声明式事务就好了,我现在用的就没问题了试试在Dao层注入sessionFactory,比如<preclass="brush:java;toolbar:true;auto-links:false;">@RepositorypublicclassBaseHibernateImplextendsHibernateDaoSupportimplementsIBaseHibernate{privateSessionFactorysessionFactory;@AutowiredpublicvoidsetSessionFacotry(SessionFactorysessionFacotry){super.setSessionFactory(sessionFacotry);}} OpenSessionView是用来减决Hibernate懒加载问题,如果在程序使用了load/iterator等方法时,程序并不会马上向数据库发出SQL,等你在前台页面获取时,此时session已经早就关闭(因为事务一般都是在service层),会出现错误。如果程序没有使用事务,如果在程序中进行了更新删除操作,那么也是不允许的,因为spring中默认事务是只读事务,这样也会出现错误。可以在DAO设置,HibernateTemplate有一个变量可以查看源码。spring中已经自动支持了getCurrentSession(),请不要在Hibernate配置hibernate.current_session_context_class为“Thread”否则也会出错 用currentsession就不要在配置文件里配置thread了 而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下<beanid="txManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager">    <propertyname="sessionFactory"ref="sessionFactory"/>  </bean><spanstyle="font-size:13.3333330154419px;"><tx:annotation-driventransaction-manager="txManager"/> mybatis事务配置: <spanstyle="background-color:#efefef;"><<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">bean<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">class<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="org.springframework.jdbc.datasource.DataSourceTransactionManager"<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">id<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="transactionManager"<spanstyle="background-color:#efefef;">><spanstyle="background-color:#efefef;"><<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">property<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">name<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="dataSource"<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">ref<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="dataSource"<spanstyle="background-color:#efefef;">/><spanstyle="background-color:#efefef;"></<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">bean<spanstyle="background-color:#efefef;">> <spanstyle="background-color:#efefef;"><<spanstyle="color:#660e7a;background-color:#efefef;font-weight:bold;">tx<spanstyle="color:#000080;background-color:#efefef;font-weight:bold;">:annotation-driven<spanstyle="color:#0000ff;background-color:#efefef;font-weight:bold;">transaction-manager<spanstyle="color:#008000;background-color:#efefef;font-weight:bold;">="transactionManager"<spanstyle="background-color:#efefef;">/> <spanstyle="background-color:#efefef;">需要导入spring-orm(依赖spring-jdbc)包 我用的是Spring4+Hibernate5,和你版本不一样,答不了<imgsrc="http://www.oschina.net/js/ke/plugins/emoticons/images/0.gif"alt=""> <tx:annotation-driventransaction-manager="transactionManager"/> 上面这句需要加在DispatcherServlet指定的xml中 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>   <init-param>     <param-name>contextConfigLocation</param-name>     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>   </init-param> 加在下面的root xml中,会导致在servlet时调用不到事务管理器 <context-param>   <param-name>contextConfigLocation</param-name>   <param-value>/WEB-INF/spring/root-context.xml</param-value> </context-param> 之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driventransaction-manager="transactionManager"/>放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。楼主现在怎么解决的能贴出来嘛?我也遇到这个问题不要用声明式事务就好了,我现在用的就没问题了我也和你遇到一样的问题了。。。不知道如何接解决啊~~~

爱吃鱼的程序员 2020-06-14 18:24:16 0 浏览量 回答数 0

回答

"没有大神吗?怎么没一个人留言呢?唉。。。。伤心啊######我也借用了 ,有点问题,后来重新生成entity,就好了!感谢楼主无私奉献!######楼主解决了没有,我也遇到这问题了,同求解决######AOP 配置是?######现在没有问题了,用aop的配置,不要用声明式的事务,就可以了######我也不知道怎么就好了######同求答案######不要用声明式事务就好了,我现在用的就没问题了######试试在Dao层注入sessionFactory,比如 <pre class=""brush:java; toolbar: true; auto-links: false;"">@Repository public class BaseHibernateImpl extends HibernateDaoSupport implements IBaseHibernate { private SessionFactory sessionFactory; @Autowired public void setSessionFacotry(SessionFactory sessionFacotry) { super.setSessionFactory(sessionFacotry); } } ######OpenSessionView是用来减决Hibernate懒加载问题,如果在程序使用了load/iterator等方法时,程序并不会马上向数据库发出SQL,等你在前台页面获取时,此时session已经早就关闭(因为事务一般都是在service层),会出现错误。如果程序没有使用事务,如果在程序中进行了更新删除操作,那么也是不允许的,因为spring中默认事务是只读事务,这样也会出现错误。可以在DAO设置,HibernateTemplate有一个变量可以查看源码。spring中已经自动支持了getCurrentSession(),请不要在Hibernate配置hibernate.current_session_context_class为“Thread”否则也会出错###### 用currentsession就不要在配置文件里配置thread了 而且现在事务都用注解了,只要配置好包扫描然后加上@Transactional就可以了,配置如下 <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">         <property name="sessionFactory" ref="sessionFactory"/>     </bean> <tx:annotation-driven transaction-manager="txManager"/> mybatis事务配置: <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> 需要导入spring-orm(依赖spring-jdbc)包 ######我用的是Spring 4 + Hibernate 5 ,和你版本不一样,答不了 ###### <tx:annotation-driven transaction-manager="transactionManager" /> 上面这句需要加在DispatcherServlet指定的xml中 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     <init-param>       <param-name>contextConfigLocation</param-name>       <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>     </init-param> 加在下面的root xml中,会导致在servlet时调用不到事务管理器 <context-param>     <param-name>contextConfigLocation</param-name>     <param-value>/WEB-INF/spring/root-context.xml</param-value>   </context-param> 之所以你用junit可以,是因为junit进来不是经过servlet进来所以你配置在root中的事务管理器能找到。但是普通通过servlet进来的请求,找不到root中的事务管理器,所以需要在DispachServlet指定的xml中配置事务管理器供其使用 ######这条回答有用,我分applicationContext.xml与spring-mvc.xml两个配置,将<tx:annotation-driven transaction-manager="transactionManager" />放在applicationContext.xml里面就报这个错,改放在spring-mvc.xml里面就好了。######楼主现在怎么解决的能贴出来嘛?我也遇到这个问题######不要用声明式事务就好了,我现在用的就没问题了######我也和你遇到一样的问题了。。。不知道如何接解决啊~~~ " ![image.png](https://ucc.alicdn.com/pic/developer-ecology/ed7fc1faf83a45949200f47d6939af75.png)

montos 2020-05-30 22:57:12 0 浏览量 回答数 0

问题

springmvc+mybatis 事务不起作用:报错

kun坤 2020-06-06 13:55:19 0 浏览量 回答数 1

回答

本文 step by step 展示如何使用 容器服务 Kubernetes 托管版 和 ECI 完成在线业务的弹性伸缩。 准备业务镜像 整体业务请求链路如上图所示,用户请求biz-app(模拟入口业务应用),biz-app会请求cpu-app(模拟耗cpu应用)和mem-app(耗mem应用),所以需要打三个docker镜像。 biz-app:registry.cn-hangzhou.aliyuncs.com/eci-springboot-demo/biz-app:1.0 mem-app:registry.cn-hangzhou.aliyuncs.com/eci-springboot-demo/mem-app:1.1 cpu-app:registry.cn-hangzhou.aliyuncs.com/eci-springboot-demo/cpu-app:1.0 2. 创建 容器服务 Kubernetes 托管版集群 本文使用“Kubernetes 托管版”集群类型,使用ECS Node服务业务的正常水位,通过ack-virtual-kubelet-autoscaler来使用Virtual Node(底层资源是ECI)来服务业务的弹性水位 部署vk,vk-autoscaler 在容器服务控制台的市场-应用目录中,根据文档先后安装ack-virtual-node和ack-virtual-kubelet-autoscaler 部署业务应用 在容器服务控制台的应用中,根据业务形态选择对应的部署形式,本文采用的无状态(Deployment) 填入相关内容,选择前面准备好的业务镜像,配置service,即可创建完成 创建biz-app的时候,需要传入2个环境变量(值来自cpu-app和mem-app的service的内部端点) 并且biz-app需要提供出ingress路由,将业务能力暴露到外部环境 配置弹性伸缩策略 在应用-无状态中,选择业务app,配置“容器组水平伸缩器” 目前默认策略支持mem和cpu,也可以自己实现更多复杂的策略 部署三方应用 在市场-应用目录中,可以根据业务需要,安装部署相应的App,本文中部署了以下App ack-virtual-node:通过vk来将pod创建在eci上 ack-virtual-kubelet-autoscaler:通过vk动态的将pod创建在eci上(本文在eci上实现的弹性伸缩能力就是借助于此) ahas:提供应用架构自动探测,故障注入式高可用能力评测和一键流控降级等功能 arms-pilot:自动发现应用拓扑、自动生成 3D 拓扑、自动发现并监控接口、捕获异常事务和慢事务 arms-prometheus:对接开源 Prometheus 生态,支持类型丰富的组件监控,提供多种开箱即用的预置监控大盘,且提供全面托管的 Prometheus 服务 7. PTS 压测 使用PTS对服务进行压测,来模拟业务低峰期到高峰期的一个过程 观察效果 可以看到qps从1调整到5、10、20的过程中,mem-app和cpu-app根据应用的负载情况进行了动态的扩容

1934890530796658 2020-03-20 19:14:36 0 浏览量 回答数 0

回答

回 1楼(苍穹之巅007) 的帖子 恩。TPCC将会在 OB 2.1版本后开始测试。 预计11月底可以。 ------------------------- 上面OB使用了6台机器。考虑到TiDB是用三台存储节点提供服务。于是我把OB租户缩容到三台机器再重新测试一下。 测试脚本不变。测试结论也不变。SATA盘性能确实不怎么好。当数据量非常大的时候,TiKV的主机Pagecache命中率和OBServer的Block cache命中率都不高的时候,都会有很多随机磁盘IO,磁盘的性能间接都会影响二者的RT和吞吐。 纯读场景 读写混合 纯写场景 ------------------------- 回 7楼(klkyy2018) 的帖子 机器就是 https://bbs.aliyun.com/read/589394.html 这个里面提到的。 资源池规格最大不超过单机的资源大小。 ------------------------- 回 10楼(EricSyh) 的帖子 恩,好。  记着了。 ------------------------- Re:回 12楼(zhm) 的帖子 请带上下面参数 试试 --db-ps-mode=disable  --mysql-ignore-errors=6002,6004,4012,2013,4016 1. OB 1.4还不支持prepare 接口,所以需要禁用。 2. 在导入数据过程中,OB有可能因为冻结合并发生内部切主或者kill事务(1.x版本问题,2.x没有),需要客户端自动重连。所以要加上 一些error的忽略。否则sysbench客户端会话直接中断退出了。

mq4096 2019-12-02 00:44:24 0 浏览量 回答数 0

回答

回 1楼(苍穹之巅007) 的帖子 恩。TPCC将会在 OB 2.1版本后开始测试。 预计11月底可以。 ------------------------- 上面OB使用了6台机器。考虑到TiDB是用三台存储节点提供服务。于是我把OB租户缩容到三台机器再重新测试一下。 测试脚本不变。测试结论也不变。SATA盘性能确实不怎么好。当数据量非常大的时候,TiKV的主机Pagecache命中率和OBServer的Block cache命中率都不高的时候,都会有很多随机磁盘IO,磁盘的性能间接都会影响二者的RT和吞吐。 纯读场景 读写混合 纯写场景 ------------------------- 回 7楼(klkyy2018) 的帖子 机器就是 https://bbs.aliyun.com/read/589394.html 这个里面提到的。 资源池规格最大不超过单机的资源大小。 ------------------------- 回 10楼(EricSyh) 的帖子 恩,好。  记着了。 ------------------------- Re:回 12楼(zhm) 的帖子 请带上下面参数 试试 --db-ps-mode=disable  --mysql-ignore-errors=6002,6004,4012,2013,4016 1. OB 1.4还不支持prepare 接口,所以需要禁用。 2. 在导入数据过程中,OB有可能因为冻结合并发生内部切主或者kill事务(1.x版本问题,2.x没有),需要客户端自动重连。所以要加上 一些error的忽略。否则sysbench客户端会话直接中断退出了。

mq4096 2019-12-02 00:44:24 0 浏览量 回答数 0

回答

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 共享锁 共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。 更新锁 更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。 若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。 排它锁 排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。 意向锁 意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。 意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 锁模式 描述 意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。 意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 与意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。 独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。 共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。 更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。 虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。 使用行级锁定的主要是InnoDB存储引擎。 3.页级锁定(page-level) 页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。 在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。 使用页级锁定的主要是BerkeleyDB存储引擎。 总的来说,MySQL这3种锁的特性可大致归纳如下: 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低; 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高; 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 适用:从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。 -------------MYSQL处理------------------ 表级锁定 由于MyISAM存储引擎使用的锁定机制完全是由MySQL提供的表级锁定实现,所以下面我们将以MyISAM存储引擎作为示例存储引擎。 1.MySQL表级锁的锁模式 MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。锁模式的兼容性: 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求; 对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作; MyISAM表的读操作与写操作之间,以及写操作之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。 2.如何加表锁 MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。 3.MyISAM表锁优化建议 对于MyISAM存储引擎,虽然使用表级锁定在锁定实现的过程中比实现行级锁定或者页级锁所带来的附加成本都要小,锁定本身所消耗的资源也是最少。但是由于锁定的颗粒度比较到,所以造成锁定资源的争用情况也会比其他的锁定级别都要多,从而在较大程度上会降低并发处理能力。所以,在优化MyISAM存储引擎锁定问题的时候,最关键的就是如何让其提高并发度。由于锁定级别是不可能改变的了,所以我们首先需要尽可能让锁定的时间变短,然后就是让可能并发进行的操作尽可能的并发。 (1)查询表级锁争用情况 MySQL内部有两组专门的状态变量记录系统内部锁资源争用情况: mysql> show status like 'table%'; +----------------------------+---------+ | Variable_name | Value | +----------------------------+---------+ | Table_locks_immediate | 100 | | Table_locks_waited | 10 | +----------------------------+---------+ 这里有两个状态变量记录MySQL内部表级锁定的情况,两个变量说明如下: Table_locks_immediate:产生表级锁定的次数; Table_locks_waited:出现表级锁定争用而发生等待的次数; 两个状态值都是从系统启动后开始记录,出现一次对应的事件则数量加1。如果这里的Table_locks_waited状态值比较高,那么说明系统中表级锁定争用现象比较严重,就需要进一步分析为什么会有较多的锁定资源争用了。 (2)缩短锁定时间 如何让锁定时间尽可能的短呢?唯一的办法就是让我们的Query执行时间尽可能的短。 a)尽两减少大的复杂Query,将复杂Query分拆成几个小的Query分布进行; b)尽可能的建立足够高效的索引,让数据检索更迅速; c)尽量让MyISAM存储引擎的表只存放必要的信息,控制字段类型; d)利用合适的机会优化MyISAM表数据文件。 (3)分离能并行的操作 说到MyISAM的表锁,而且是读写互相阻塞的表锁,可能有些人会认为在MyISAM存储引擎的表上就只能是完全的串行化,没办法再并行了。大家不要忘记了,MyISAM的存储引擎还有一个非常有用的特性,那就是ConcurrentInsert(并发插入)的特性。 MyISAM存储引擎有一个控制是否打开Concurrent Insert功能的参数选项:concurrent_insert,可以设置为0,1或者2。三个值的具体说明如下: concurrent_insert=2,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录; concurrent_insert=1,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置; concurrent_insert=0,不允许并发插入。 可以利用MyISAM存储引擎的并发插入特性,来解决应用中对同一表查询和插入的锁争用。例如,将concurrent_insert系统变量设为2,总是允许并发插入;同时,通过定期在系统空闲时段执行OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞。 (4)合理利用读写优先级 MyISAM存储引擎的是读写互相阻塞的,那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢? 答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前。 这是因为MySQL的表级锁定对于读和写是有不同优先级设定的,默认情况下是写优先级要大于读优先级。 所以,如果我们可以根据各自系统环境的差异决定读与写的优先级: 通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接读比写的优先级高。如果我们的系统是一个以读为主,可以设置此参数,如果以写为主,则不用设置; 通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。 虽然上面方法都是要么更新优先,要么查询优先的方法,但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题。 另外,MySQL也提供了一种折中的办法来调节读写冲突,即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后,MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会。 这里还要强调一点:一些需要长时间运行的查询操作,也会使写进程“饿死”,因此,应用中应尽量避免出现长时间运行的查询操作,不要总想用一条SELECT语句来解决问题,因为这种看似巧妙的SQL语句,往往比较复杂,执行时间较长,在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每一步查询都能在较短时间完成,从而减少锁冲突。如果复杂查询不可避免,应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行 三、行级锁定 行级锁定不是MySQL自己实现的锁定方式,而是由其他存储引擎自己所实现的,如广为大家所知的InnoDB存储引擎,以及MySQL的分布式存储引擎NDBCluster等都是实现了行级锁定。考虑到行级锁定君由各个存储引擎自行实现,而且具体实现也各有差别,而InnoDB是目前事务型存储引擎中使用最为广泛的存储引擎,所以这里我们就主要分析一下InnoDB的锁定特性。 1.InnoDB锁定模式及实现机制 考虑到行级锁定君由各个存储引擎自行实现,而且具体实现也各有差别,而InnoDB是目前事务型存储引擎中使用最为广泛的存储引擎,所以这里我们就主要分析一下InnoDB的锁定特性。 总的来说,InnoDB的锁定机制和Oracle数据库有不少相似之处。InnoDB的行级锁定同样分为两种类型,共享锁和排他锁,而在锁定机制的实现过程中为了让行级锁定和表级锁定共存,InnoDB也同样使用了意向锁(表级锁定)的概念,也就有了意向共享锁和意向排他锁这两种。 当一个事务需要给自己需要的某个资源加锁的时候,如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁。但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。如果自己需要一个共享锁,那么就在表上面添加一个意向共享锁。而如果自己需要的是某行(或者某些行)上面添加一个排他锁的话,则先在表上面添加一个意向排他锁。意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。所以,可以说InnoDB的锁定模式实际上可以分为四种:共享锁(S),排他锁(X),意向共享锁(IS)和意向排他锁(IX),我们可以通过以下表格来总结上面这四种所的共存逻辑关系 如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。 意向锁是InnoDB自动加的,不需用户干预。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句显示给记录集加共享锁或排他锁。 共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE 用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作。 但是如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT... FOR UPDATE方式获得排他锁。 2.InnoDB行锁实现方式 InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁 在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面通过一些实际例子来加以说明。 (1)在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁。 (2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。 (3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。 (4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 3.间隙锁(Next-Key锁) 当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁; 对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。 例: 假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL: mysql> select * from emp where empid > 100 for update; 是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。 InnoDB使用间隙锁的目的: (1)防止幻读,以满足相关隔离级别的要求。对于上面的例子,要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句,就会发生幻读; (2)为了满足其恢复和复制的需要。 很显然,在使用范围条件检索并锁定记录时,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害。 除了间隙锁给InnoDB带来性能的负面影响之外,通过索引实现锁定的方式还存在其他几个较大的性能隐患: (1)当Query无法利用索引的时候,InnoDB会放弃使用行级别锁定而改用表级别的锁定,造成并发性能的降低; (2)当Query使用的索引并不包含所有过滤条件的时候,数据检索使用到的索引键所只想的数据可能有部分并不属于该Query的结果集的行列,但是也会被锁定,因为间隙锁锁定的是一个范围,而不是具体的索引键; (3)当Query在使用索引定位数据的时候,如果使用的索引键一样但访问的数据行不同的时候(索引只是过滤条件的一部分),一样会被锁定。 因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。 还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁。 4.死锁 MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,当两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁。 在InnoDB的事务管理和锁定机制中,有专门检测死锁的机制,会在系统中产生死锁之后的很短时间内就检测到该死锁的存在。当InnoDB检测到系统中产生了死锁之后,InnoDB会通过相应的判断来选这产生死锁的两个事务中较小的事务来回滚,而让另外一个较大的事务成功完成。 那InnoDB是以什么来为标准判定事务的大小的呢?MySQL官方手册中也提到了这个问题,实际上在InnoDB发现死锁之后,会计算出两个事务各自插入、更新或者删除的数据量来判定两个事务的大小。也就是说哪个事务所改变的记录条数越多,在死锁中就越不会被回滚掉。 但是有一点需要注意的就是,当产生死锁的场景中涉及到不止InnoDB存储引擎的时候,InnoDB是没办法检测到该死锁的,这时候就只能通过锁定超时限制参数InnoDB_lock_wait_timeout来解决。 需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。 通常来说,死锁都是应用设计的问题,通过调整业务流程、数据库对象设计、事务大小,以及访问数据库的SQL语句,绝大部分死锁都可以避免。下面就通过实例来介绍几种避免死锁的常用方法: (1)在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。 (2)在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能。 (3)在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁,更新时再申请排他锁,因为当用户申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁。 (4)在REPEATABLE-READ隔离级别下,如果两个线程同时对相同条件记录用SELECT...FOR UPDATE加排他锁,在没有符合该条件记录情况下,两个线程都会加锁成功。程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁。这种情况下,将隔离级别改成READ COMMITTED,就可避免问题。 (5)当隔离级别为READ COMMITTED时,如果两个线程都先执行SELECT...FOR UPDATE,判断是否存在符合条件的记录,如果没有,就插入记录。此时,只有一个线程能插入成功,另一个线程会出现锁等待,当第1个线程提交后,第2个线程会因主键重出错,但虽然这个线程出错了,却会获得一个排他锁。这时如果有第3个线程又来申请排他锁,也会出现死锁。对于这种情况,可以直接做插入操作,然后再捕获主键重异常,或者在遇到主键重错误时,总是执行ROLLBACK释放获得的排他锁。 5.什么时候使用表锁 对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁: (1)事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。 (2)事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。 应用中这两种事务不能太多,否则,就应该考虑使用MyISAM表了。 在InnoDB下,使用表锁要注意以下两点。 (1)使用LOCK TABLES虽然可以给InnoDB加表级锁,但必须说明的是,表锁不是由InnoDB存储引擎层管理的,而是由其上一层──MySQL Server负责的,仅当autocommit=0、InnoDB_table_locks=1(默认设置)时,InnoDB层才能知道MySQL加的表锁,MySQL Server也才能感知InnoDB加的行锁,这种情况下,InnoDB才能自动识别涉及表级锁的死锁,否则,InnoDB将无法自动检测并处理这种死锁。 (2)在用 LOCK TABLES对InnoDB表加锁时要注意,要将AUTOCOMMIT设为0,否则MySQL不会给表加锁;事务结束前,不要用UNLOCK TABLES释放表锁,因为UNLOCK TABLES会隐含地提交事务;COMMIT或ROLLBACK并不能释放用LOCK TABLES加的表级锁,必须用UNLOCK TABLES释放表锁。

1006541099824509 2019-12-02 03:14:39 0 浏览量 回答数 0

回答

多谢关注,我换了种写法就OK了:<preclass="brush:xml;toolbar:true;auto-links:false;"><propertyname="hibernateProperties"><value><!--设置数据库方言-->hibernate.dialect=org.hibernate.dialect.MySQLDialect<!--设置自动创建|更新|验证数据库表结构-->hibernate.hbm2ddl.auto=update<!--是否在控制台显示sql-->hibernate.show_sql=true<!--是否格式化sql,优化显示-->hibernate.format_sql=true<!--是否开启二级缓存-->hibernate.cache.use_second_level_cache=false<!--是否开启查询缓存-->hibernate.cache.use_query_cache=false<!--数据库批量查询最大数-->hibernate.jdbc.fetch_size=50<!--数据库批量更新、添加、删除操作最大数-->hibernate.jdbc.batch_size=50<!--是否自动提交事务-->hibernate.connection.autocommit=true<!--指定hibernate在何时释放JDBC连接-->hibernate.connection.release_mode=auto<!--创建session方式hibernate4.x的方式-->hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext<!--javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包所以把它设置为none即可-->javax.persistence.validation.mode=none</value></property> 亲,www.baidu.com http://demo.netfoucs.com/sinat_19425927/article/details/39855045这里有一篇不知道是否适用 不知道你英文如何,这里也有 http://www.tuicool.com/articles/7FZrYzE 请先运用板砖工具...

爱吃鱼的程序员 2020-06-14 17:23:24 0 浏览量 回答数 0

回答

了解数据库的事务(自动提交,显式和隐式)处理可以使您不必从备份中还原数据。 事务控制数据操作语句以确保它们是原子的。“原子性”表示交易已发生或未发生。向数据库发出事务完成信号的唯一方法是使用COMMITor ROLLBACK语句(根据ANSI-92,遗憾的是它不包含用于创建/开始事务的语法,因此它是特定于供应商的)。 COMMIT应用在交易中进行的更改(如果有)。ROLLBACK忽略事务中发生的任何动作-当UPDATE / DELETE语句做意外的事情时,这是非常理想的。 通常,单个DML(插入,更新,删除)语句在自动提交事务中执行-语句成功完成后便会提交它们。这意味着在像您这样的情况下,没有机会将数据库回滚到语句运行之前的状态。当出现问题时,唯一可用的还原选项是从备份中重建数据(假设存在备份)。在MySQL中,默认情况下,InnoDB的自动提交功能处于启用状态 -MyISAM不支持事务。可以使用以下命令禁用它: SET autocommit = 0 显式事务是指将语句包装在显式定义的事务代码块中- 对于MySQL,即START TRANSACTION。它还需要在交易结束时明确做出COMMIT或ROLLBACK声明。嵌套事务不在本主题的范围之内。 隐式交易与显式交易略有不同。隐式事务不需要显式定义事务。但是,像显式事务一样,它们需要提供COMMITor ROLLBACK语句。 结论 显式事务是最理想的解决方案-它们要求使用语句COMMIT或ROLLBACK来完成事务,并且明确说明正在发生的事情,以便其他人在需要时阅读。如果以交互方式使用数据库,则隐式事务是可以的,但是COMMIT只有在对结果进行了测试并确定其有效之后,才应指定语句。 这意味着您应该使用: SET autocommit = 0; START TRANSACTION; UPDATE ...; ...并且仅COMMIT;在结果正确时使用。 也就是说,UPDATE和DELETE语句通常仅返回受影响的行数,而不返回特定的详细信息。将此类语句转换为SELECT语句,并在尝试UPDATE / DELETE语句之前检查结果以确保正确性。 附录 DDL(数据定义语言)语句是自动提交的-它们不需要COMMIT语句。IE:表,索引,存储过程,数据库和视图创建或更改语句。来源:stack overflow

保持可爱mmm 2020-05-17 21:01:37 0 浏览量 回答数 0

回答

springboot 对新人来说可能上手比springmvc要快,但是对于各位从springmvc转战到springboot的话,有些地方还需要适应下,尤其是xml配置。我个人是比较喜欢注解➕xml是因为看着方便,查找方便,清晰明了。但是xml完全可以使用注解代替,今天就扒一扒springboot中事务使用注解的玩法。   springboot的事务也主要分为两大类,一是xml声明式事务,二是注解事务,注解事务也可以实现类似声明式事务的方法,关于注解声明式事务,目前网上搜索不到合适的资料,所以在这里,我将自己查找和总结的几个方法写到这里,大家共同探讨 springboot 之 xml事务 可以使用 @ImportResource("classpath:transaction.xml") 引入该xml的配置,xml的配置如下 <?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" ></property> </bean> <tx:advice id="cftxAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="query*" propagation="SUPPORTS" read-only="true" ></tx:method> <tx:method name="get*" propagation="SUPPORTS" read-only="true" ></tx:method> <tx:method name="select*" propagation="SUPPORTS" read-only="true" ></tx:method> <tx:method name="*" propagation="REQUIRED" rollback-for="Exception" ></tx:method> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution (* com.exmaple.fm..service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" order="0" /> </aop:config> springboot 启动类如下:package com.example.fm; import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource; @ImportResource("classpath:transaction.xml")@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }启动后即可开启事务,不过项目里导入了xml配置,如果不想导入xml配置,可以使用注解的方式。 springboot 之 注解事务   注解事务讲解之前,需要先了解下spring创建代理的几个类,在spring内部,是通过BeanPostProcessor来完成自动创建代理工作的。BeanPostProcessor接口的实现只是在ApplicationContext初始化的时候才会自动加载,而普通的BeanFactory只能通过编程的方式调用之。根据 匹配规则的不同大致分为三种类别:     a、匹配Bean的名称自动创建匹配到的Bean的代理,实现类BeanNameAutoProxyCreator*Service testInterceptor b、根据Bean中的AspectJ注解自动创建代理,实现类AnnotationAwareAspectJAutoProxyCreator <aop:aspect ref="annotationAwareAspectJAutoProxyCreatorTest"> <aop:around method="process" pointcut="execution (* com.example.service.fm..*.*(..))"/> </aop:aspect> c、根据Advisor的匹配机制自动创建代理,会对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中,实现类DefaultAdvisorAutoProxyCreator

zwt9000 2019-12-02 00:20:32 0 浏览量 回答数 0

问题

为 MySQL/MariaDB 开启 Binlog 功能

妙正灰 2019-12-01 21:43:30 1193 浏览量 回答数 1

问题

求解:spring结合mybatis配置多数据源报错

a123456678 2019-12-01 20:23:04 1660 浏览量 回答数 1

问题

spring + jpa 配置问题,No transactional EntityManager available

a123456678 2019-12-01 20:26:35 2349 浏览量 回答数 1

回答

帮顶,我也遇见这个问题! ###### <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 引入属性文件 --> <context:property-placeholder location="classpath*:jdbc.properties" /> <!-- 配置hibernate session工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.connection.SetBigStringTryClob">true</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> </props> </property> <!-- 自动扫描注解方式配置的hibernate类文件 --> <property name="packagesToScan"> <list> <value>cn.XXX.wx.model</value> </list> </property> </bean> <!-- 配置数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="select 1 from dual" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat,wall" /> </bean> <!-- 配置Hibernate事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 基于注释的事务,当注释中发现@Transactional时,使用id为“transactionManager”的事务管理器 --> <!-- 如果没有设置transaction-manager的值,则spring以缺省默认的事务管理器来处理事务,默认事务管理器为第一个加载的事务管理器 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 配置事务异常封装 --> <bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /> <!-- 自动扫描dao和service包(自动注入) --> <context:component-scan base-package="cn.XXX.wx.dao,cn.XXX.wx.service" /> <!-- 配置druid监控spring jdbc --> <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor" /> <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype"> <property name="patterns"> <list> <value>cn.XXX.wx.service.*</value> <value>cn.XXX.wx.dao.*</value> </list> </property> </bean> <aop:config proxy-target-class="true"> <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" /> </aop:config> </beans> 我这样写可以的,希望能帮到你!

kun坤 2020-06-04 13:26:34 0 浏览量 回答数 0

回答

应该是还在使用HibernateTemplate的问题,Hibernate4中Spring不再提供Template了而是改用Hibernate的原生Session,建议自行Google一下Hibernate4 和 Spring ######回复 @姚君 : Heibernate自带的SessionFactory的getCurrentSession是可以用的,不过hibernate4的Session已经不在classic包了,所以Spring内部的那些就没法了######可以用openSession 但是 不能用getCurrentSession######我知道你的问题在哪里!首先说明下, getCurrentSession()是能用的,但是有几点必须要注意,这是Hibernate4和Hibernate3不一样的地方 1.不能在使用HibernateTemplate,Spring已经不建议使用了,应该将SessionFactory直接注入到DAO,而不再是HibernateTemplate 2.不能使用openSession,openSession获取的session是不受Spring切面事务管理的,必须使用 getCurrentSession ,而且必须开启事务, getCurrentSession 才能正确获取到,因为在Spring3中session是被绑定在SpringSessionContext中的,所以 getCurrentSession 是从这个上下文的线程局部变量去获取session,而且只有开启事务了,session才会绑定到这个上下文中 ###### <!-- 会话工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource-c3p0"/> <property name="hibernateProperties"> <props> <prop key="hiberante.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> --> </props> </property> <property name="packagesToScan"> <!-- 多个包用逗号分割 --> <value>com.ymxx.jweb.persistence</value> </property> </bean> <!-- 事务管理器--> <bean id="transactionManager-hibernate" abstract="false" lazy-init="default" autowire="default" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <tx:annotation-driven/>###### <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> 注意这一行,配置文件里不要写,开启事务后,Spring会自动帮你绑定,这就告诉你,session是从这里面取的,但是要开启事务才能获取到 ######我比较喜欢使用标注型事务,而不是xml风格的事务: @Service("accountService") @Transactional("transactionManager-hibernate") public class AccountService { 这样就在service上开启事务了,就能通过currentSessin获取链接了,这个事务会应用的该service中所有的public方法上,默认事务传播属性为required,这些事务属性你可以自定义 ######这个东西要看Spring3的文档,或者源代码才能知道,我一开始也被折腾了半条命,其实Spring3更简洁更强大,只是我们走得弯路多而已######我找到原因了,是因为com.googlecode.genericdao 这个框架的原因,sessionFactory不能注入进去,不知道为什么。###### 引用来自“hoodlake”的答案 <!-- 会话工厂 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource-c3p0"/> <property name="hibernateProperties"> <props> <prop key="hiberante.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">false</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <!-- <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> --> </props> </property> <property name="packagesToScan"> <!-- 多个包用逗号分割 --> <value>com.ymxx.jweb.persistence</value> </property> </bean> <!-- 事务管理器--> <bean id="transactionManager-hibernate" abstract="false" lazy-init="default" autowire="default" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <tx:annotation-driven/> 我也是这么配置的,只是我com.googlecode.genericdao不能注入sessionFctroy...自己写dao就可以用 ######com.googlecode.genericdao,这个如果不是你自己写的,那里面有SessionFactory这个成员变量吗?或者你可以继承下这个DAO,然后在子类里写个SessionFactory,然后注入到子类 ######写了子类,但是注入不了,不知道为什么,换成hibernate3就行######也碰到此问题,应该怎么办呢 =============================== https://developer.aliyun.com/ask/290761 -*-*- 学习了,######5.0以后这招不好使了吧 大忽悠

kun坤 2020-05-29 11:14:58 0 浏览量 回答数 0

回答

事物配置如下: <!--事务自动代理--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="false"> <aop:pointcut id="pointcut" expression="execution(* com.juncsoft.llgj.*.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config>

a123456678 2019-12-02 02:13:45 0 浏览量 回答数 0

问题

hibernate 每次获取 数据都会访问数据库?

爵霸 2019-12-01 20:05:45 1135 浏览量 回答数 1

问题

纠结一天了!Spring整合hibernate4事物配置一直有问题,求帮忙看看,一直提示advised by org.springframework.transaction.interceptor.T

a123456678 2019-12-01 20:25:44 3065 浏览量 回答数 1

回答

为了应对突发的数据库请求流量、资源消耗过高的语句访问以及SQL访问模型的变化, 保证MySQL实例持续稳定运行,阿里云提供基于语句规则的并发控制CCL(Concurrency Control),并提供了工具包(DBMS_CCL)便于您快捷使用。 前提条件 实例版本为RDS MySQL 8.0。 注意事项 CCL的操作不产生Binlog,所以CCL的操作只影响当前实例。例如主实例进行CCL操作,不会同步到备实例、只读实例或灾备实例。 CCL提供超时机制以应对DML导致事务锁死锁,等待中的线程也会响应事务超时和线程KILL操作以应对死锁。 功能设计 CCL规则定义了如下三个维度的特征: SQL command SQL命令类型,例如SELECT、UPDATE、INSERT、DELETE等。 Object SQL命令操作的对象,例如TABLE、VIEW等。 keywords SQL命令的关键字。 创建CCL规则表 AliSQL设计了一个系统表(concurrency_control)保存CCL规则,系统启动时会自动创建该表,无需您手动创建。这里提供表的创建语句供您参考: CREATE TABLE concurrency_control ( Id bigint(20) NOT NULL AUTO_INCREMENT, Type enum('SELECT','UPDATE','INSERT','DELETE') NOT NULL DEFAULT 'SELECT', Schema_name varchar(64) COLLATE utf8_bin DEFAULT NULL, Table_name varchar(64) COLLATE utf8_bin DEFAULT NULL, Concurrency_count bigint(20) DEFAULT NULL, Keywords text COLLATE utf8_bin, State enum('N','Y') NOT NULL DEFAULT 'Y', Ordered enum('N','Y') NOT NULL DEFAULT 'N', PRIMARY KEY (Id) ) /*!50100 TABLESPACE mysql */ ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 COMMENT='Concurrency control' 参数 说明 Id CCL规则ID。 Type SQL command,即SQL命令类型。 Schema_name 数据库名。 Table_name 数据库内的表名。 Concurrency_count 并发数。 Keywords 关键字,多个关键字用英文分号(;)分隔。 State 本规则是否启用。 Ordered Keywords中多个关键字是否按顺序匹配。 管理CCL规则 为了便捷地管理CCL规则,AliSQL在DBMS_CCL中定义了四个本地存储规则。详细说明如下: add_ccl_rule 增加规则。命令如下: dbms_ccl.add_ccl_rule(' ','<Schema_name>','<Table_name>',<Concurrency_count>,' '); 示例: SELECT语句的并发数为10。 mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); SELECT语句中出现关键字key1的并发数为20。 mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); test.t表的SELECT语句的并发数为10。 mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); 说明 Id越大,规则的优先级越高。 del_ccl_rule 删除规则。命令如下: dbms_ccl.del_ccl_rule( ); 示例: 删除规则ID为15的CCL规则。 mysql> call dbms_ccl.del_ccl_rule(15); 说明 如果删除的规则不存在,系统会报相应的警告,您可以使用show warnings;查看警告内容。 mysql> call dbms_ccl.del_ccl_rule(100); Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 7514 | Concurrency control rule 100 is not found in table | | Warning | 7514 | Concurrency control rule 100 is not found in cache | +---------+------+----------------------------------------------------+ show_ccl_rule 查看内存中已启用规则。命令如下: dbms_ccl.show_ccl_rule(); 示例: ​mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 17 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | | | 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 | | 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+​ 关于MATCHED、RUNNING和WAITTING的说明如下。 参数 说明 MATCHED 规则匹配成功次数。 RUNNING 此规则下正在并发执行的线程数。 WAITTING 此规则下正在等待执行的线程数。 flush_ccl_rule 如果您直接操作了表concurrency_control修改规则,规则不能立即生效,您需要让规则重新生效。命令如下: dbms_ccl.flush_ccl_rule(); 示例: ​mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15 where Id = 18; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> call dbms_ccl.flush_ccl_rule(); Query OK, 0 rows affected (0.00 sec)​ 功能测试 测试规则 设计如下三条规则对应三个维度: call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); //SELECT命令操作表sbtest1并发数为3 call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); //SELECT命令关键字sbtest2并发数为2 call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); //SELECT命令并发数为2 测试场景 使用sysbench进行测试,场景如下: 64 threads 4 tables select.lua 测试结果 查看规则并发数情况如下: ​mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 20 | SELECT | test | sbtest1 | Y | N | 3 | 389 | 3 | 9 | | | 21 | SELECT | | | Y | N | 2 | 375 | 2 | 14 | sbtest2 | | 22 | SELECT | | | Y | N | 2 | 519 | 2 | 34 | | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ 3 rows in set (0.00 sec)​ 查看RUNNING列,符合预期的并行数量。

游客yl2rjx5yxwcam 2020-03-08 13:26:34 0 浏览量 回答数 0

问题

请教ExtJs与数据库通信的问题,请各位老师帮助?报错

爱吃鱼的程序员 2020-06-10 14:27:07 0 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 描述 该接口用于重启实例,重启一般在10S钟内完成。如果有大量的事务需要提交或回滚,可能会延长1分钟左右。重启实例必须满足以下条件,否则将操作失败: 实例使用中 实例没有进行中的备份 请求参数 名称 类型 是否必须 描述 Action String 是 系统规定参数,取值:RestartDBInstance。 DBInstanceId String 是 实例ID。 ClientToken String 否 用于保证幂等性。 UpgradeKernelVersion String 否 设置实例是否自动升级小版本,默认为否。 返回参数 名称 类型 描述 <公共返回参数> - 详见公共参数。 请求示例 https://rds.aliyuncs.com/?Action=RestartDBInstance &DBInstanceId=rdsaiiabnaiiabn &<公共请求参数> 返回示例 XML格式 <RestartDBInstanceResponse> <RequestId>65BDA532-28AF-4122-AA39-B382721EEE64</RequestId> </RestartDBInstanceResponse> JSON格式 { "RequestId": " 65BDA532-28AF-4122-AA39-B382721EEE64" }

2019-12-01 23:09:19 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 描述 该接口用于重启实例,重启一般在10S钟内完成。如果有大量的事务需要提交或回滚,可能会延长1分钟左右。重启实例必须满足以下条件,否则将操作失败: 实例使用中 实例没有进行中的备份 请求参数 名称 类型 是否必须 描述 Action String 是 系统规定参数,取值:RestartDBInstance。 DBInstanceId String 是 实例ID。 ClientToken String 否 用于保证幂等性。 UpgradeKernelVersion String 否 设置实例是否自动升级小版本,默认为否。 返回参数 名称 类型 描述 <公共返回参数> - 详见公共参数。 请求示例 https://rds.aliyuncs.com/?Action=RestartDBInstance &DBInstanceId=rdsaiiabnaiiabn &<公共请求参数> 返回示例 XML格式 <RestartDBInstanceResponse> <RequestId>65BDA532-28AF-4122-AA39-B382721EEE64</RequestId> </RestartDBInstanceResponse> JSON格式 { "RequestId": " 65BDA532-28AF-4122-AA39-B382721EEE64" }

2019-12-01 23:09:19 0 浏览量 回答数 0

问题

API参考 - API参考 - 实例管理 - RestartDBInstance

李沃晟 2019-12-01 21:40:27 465 浏览量 回答数 0

问题

如何在 JBoss 里配置 IBM MQ - JBoss报错

montos 2020-05-31 09:02:07 0 浏览量 回答数 1

问题

如何在 JBoss 里配置 IBM MQ:报错

kun坤 2020-06-06 22:15:10 0 浏览量 回答数 1

问题

如何在 JBoss 里配置 IBM MQ403.10 禁止访问:配置无效 

kun坤 2020-05-27 18:39:41 3 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站