事务管理

创建线程的几种方式

◇◆丶佛笑我妖孽 提交于 2019-12-06 08:45:35
1.sql语句的优化? 答案:(1)where子句中:where表之间的连接必须写在其他where条件之前,那样可以过滤掉最大数量记录的条件必须写在where子句的末尾having之后。    (2)使用exist替代in,用not exist替代not in(exist查询条件的时候使用了索引,速度更快)    (3)避免使用索引上使用计算    (4)避免在索引上添加 null 和not null    (5)对查询进行优化,应尽量避免全盘扫描,首先应该考虑在where和order by涉及的列上建立索引    (6)应尽量避免在where子句使用对字段进行null值判断,否则将导致引擎放弃使用索引转而使用全盘扫描    (7)应避免在where子句字段进行表达式操作,将导致引擎放弃使用索引转而使用全盘扫描 2.JSON 与 JS 对象的关系 很多人搞不清楚 JSON 和 JS 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解: JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。 1 var obj = {a: 'Hello' , b: 'World' }; //这是一个对象,注意键名也是可以使用引号包裹的 1 var json = '{"a": "Hello", "b": "World"}' ; //这是一个 JSON 字符串

第一章 mysql架构和历史

房东的猫 提交于 2019-12-06 07:44:53
1.1 mysql逻辑架构 客户端 连接/线程处理 查询缓存——解析器 优化器 存储引擎 1.1.1 连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只有在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。服务器会负责缓存线程,因此不需要为每一个新建的连接创建或销毁线程。 当客户端(应用)连接到mysql服务器时,服务器需要对其进行认证。认证基于用户名、原始主机信息和密码。 1.1.2 优化与执行 优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。 对于select查询语句,在解析查询之前,服务器会先检查查询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的过程,而是直接返回查询缓存中的结果集。 1.2 并发控制 1.2.1 读写锁 共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。 1.2.2锁粒度 一种提高共享资源并发性的方式就是让锁定对象更有选择性。尽量只锁定需要修改的部分数据,而不是所有的资源。更理想的方式是,只对会修改的数据片进行精确的锁定。任何时候,在给定的资源上,锁定的数据量越少,则系统的并发程度越高,只要相互之间不发生冲突即可。 问题是加锁也需要消耗资源

数据库分库分表思路

穿精又带淫゛_ 提交于 2019-12-06 05:47:38
出处: 数据库分库分表思路 一. 数据切分   关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。   数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。   数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分   垂直切分常见有垂直分库和垂直分表两种。   垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图:    垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的

分布式系统下,分布式数据库遇到的挑战

ぐ巨炮叔叔 提交于 2019-12-06 04:53:34
分布式系统下,分布式数据库遇到的挑战   分布式系统下,当访问关系型数据库的i/o占用过高,内存不足,访问过慢的情况下,可以考虑流流行的分库分表的策略,但是这样也会到来很多新的技术挑战。 1.分布式事务   当还是单体应用,单体数据库时,完全不需要考虑事务的一致性问题,因为mysql已经帮我们处理事务问题(ACID),但是这只是针对单体情况下,如果是多个数据库,主从备份,读写分离,那么就会可能造成事务不一致的情况,那么什么事分布式事务,分布式   事务又该如何解决呢?      1.有关于事务的概念     本地事务:本地事务的优点就是支持严格的ACID特性,高效,可靠,状态可以只在资源管理器中维护,而且应用编程模型简单。     全局事务:当事务由全局事务管理器进行全局管理时成为全局事务,事务管理器负责管理全局的事务状态和参与的资源,协同资源的一致提交回滚。     两阶段事务:两阶段事务提交采用的是X/OPEN组织所定义的 DTP模型 ,通过抽象出来的 AP , TM , RM 的概念可以保证事务的强一致性。 其中 TM 和 RM 间采用 XA 的协议进行双向通信。 与传统的本地事务相比,           XA事务增加了prepare阶段,数据库除了被动接受提交指令外,还可以反向通知调用方事务是否可以被提交。 因此 TM 可以收集所有分支事务的prepare结果

Spring MVC 事务管理 和 ssh 事务管理

不想你离开。 提交于 2019-12-06 03:27:17
Spring 事务的传播行为在 service 类前加上 @Transactional ,声明这个 service 所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring 默认情况下会对运行期例外 (RunTimeException) 进行事务回滚。这个例外是 unchecked 如果遇到 checked 意外就不回滚。 如何改变默认规则: 1 让 checked 例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让 unchecked 例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3 不需要事务管理的 ( 只查询的 ) 方法: @Transactional(propagation=Propagation.NOT_SUPPORTED) 在整个方法运行前就不会开启事务 可以加上: @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true) ,这样就做成一个只读事务,可以提高效率。 各种属性的意义: REQUIRED: 业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。 NOT

Oracle 数据库启动与关闭

风格不统一 提交于 2019-12-06 02:43:52
只有具备sysdba和sysoper 系统 特权的用户才能启动和关闭 数据库 。 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库。 虽然数据库正常运行,但如果没有启动监听程序,客户端就不能连接到数据库。 在oracle用户下: 启动监听程序 lsnrctl start 关闭监听程序lsnrctl stop 查询监听程序状态lsnrctl status startup 支持参数 STARTUP options | upgrade_options options为:[FORCE] [RESTRICT] [PFILE=filename] [QUIET] [ MOUNT [dbname] | [ OPEN [open_options] [dbname] ] | NOMOUNT ], NOMOUNT、MOUNT、OPEN为startup的三个阶段,不能在命令中同时存在。其中,open_options为:READ {ONLY | WRITE [RECOVER]} | RECOVER。 upgrade_options为:[PFILE=filename] {UPGRADE | DOWNGRADE} [QUIET] Oracle 数据库 的完整启动过程包含以下3个步骤: 简单地说,就是: 启动实例 --> 加载数据库 --> 打开数据库 . -------

性能测试:深入理解线程数,并发量,TPS,看这一篇就够了

喜欢而已 提交于 2019-12-05 22:39:04
并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标。 那么他们之间究竟是怎样的一个对应关系和内在联系? 测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗? 本文就将对性能领域的这些关键概念做一次探讨。 文章可能会比较长,希望您保持耐心看完。 1. 走进开封菜,了解性能 ①老王开了家餐厅 我们的主角老王 ,在M市投资新开业了一家 ,前来用餐的顾客络绎不绝: 餐厅里有4种不同身份的人员: 用户一次完整的用餐流程如下: 顾客到店小二处付款点餐 => 小二将订单转发给后厨 => 后厨与备菜工配合,取材完成烹饪后交给小二 => 小二上菜,顾客用餐。 假设所有顾客都不堂食而是打包带走,也就是不考虑用户用餐时间。餐厅完成一次订单的时间是多久? 订单时间 = 顾客点单时间 + 前台接收转发时间 + 后厨取材烹饪时间 + 后厨交给服务员,服务员上菜时间。 说白了就是每个流程的耗时相加。 假设以上时间分别为1,1,5,1(分钟),那么一次订单的完成时间就是8分钟。 ②问题来了 餐厅当然不可能只有一个人就餐,否则老王不要带着小姨子跑路。 所以我们接下来看多人就餐的情况。 假设同一时间点上有两人 就餐,会发生什么情况? 第一位用户与第一个场景一样,仍然是点单-下单-烹饪-上菜,8分钟后第一位顾客拿着打包的食物离开。 第二位用户则有所不同了。假设小二,厨师

数据库中的锁

人盡茶涼 提交于 2019-12-05 22:24:57
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致 二 锁的分类 锁的类别有两种分法: 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改

JTA的含义及应用简介

£可爱£侵袭症+ 提交于 2019-12-05 17:54:13
Java Transaction API(Java事务API) (JTA)Java Transaction API(Application Programming Interface) 什么是JTA Transaction?它有怎样的特点呢?JTA Transaction是指由J2EE Transaction manager去管理的事务。其最大的特点是调用UserTransaction接口的begin,commit和rollback方法来完成事务范围的界定,事务的提交和回滚。JTA Transaction可以实现同一事务对应不同的数据库,但是它仍然无法实现事务的嵌套。 分布式事务的规范由OMG的OTS所描述。 JTA是只是一组java接口用于描述,J2ee框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通讯。 它主要包括高层接口即面向应用程序的接口;XAResource接口即面向资源的接口;以及事务管理器的接口。值得注意的是JTA只提供了接口,没有具体的实现。 JTS是服务OTS的JTA的实现。简单的说JTS实现了JTA接口,并且符合OTS的规范。 资源管理器只要其提供给事务管理器的接口符合XA接口规范,就可以被事务管理器处理。 所以,JTA可以处理任何提供符合XA接口的资源。包括:数据库,JMS,商业对象等等 “Java 事务 API”(JTA)启用两阶段提交功能

orm的锁和事务

早过忘川 提交于 2019-12-05 17:51:19
一.锁 mysql中的加锁,不会防止其他用户的查询,会防止其他用户的增删改操作。 entries = Entry.objects.select_for_update().filter(author=request.user) #所有匹配的行将被锁定,直到事务结束 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面 目前,postgresql,oracle和mysql数据库后端支持select_for_update()。 但是,MySQL不支持nowait和skip_locked参数。 二.事务 1.全局开启 当有请求过来时,Django会在调用视图方法前开启一个事务。如果请求正确处理并正确返回了结果,Django就会提交该事务。否则,Django会回滚该事务。 这个功能使用起来非常简单,你只需要将它的配置项 ATOMIC_REQUESTS 设置为True。 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'root', 'PASSWORD': '123', 'OPTIONS': { "init