数据库事务

mysql的 视图、触发器、事务、存储过程、函数、索引与慢查询优化

試著忘記壹切 提交于 2020-02-08 04:32:37
视图假设有两张表学生和老师,学生表(sid,name,tid)关联老师表(tid,tname)创建视图的语法: create view 视图名 as SQL语句 实例:create view student2teacher as select * from student inner join teacher on student.tid=teacher.tid; 创建视图后会产生一个名为 student2teacher 的表,可以直接调用。 思考:开发过程中会不会去使用视图? 不会!视图是mysql的功能,如果你的项目里面大量的使用到了视图,那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改, 意味着你需要先在mysql这边将视图先修改一下,然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图, 而是通过重新修改sql语句来扩展功能 强调 1、在硬盘中,视图只有表结构文件,没有表数据文件 2、视图通常是用于查询,尽量不要修改视图中的数据 然后说一个关于删除视图的方法 语法:DROP VIEW 视图名称 DROP VIEW student2teacher 触发器 在某张表对数据进行增删改时自动触发的功能称之为触发器 这类行为一旦执行了就会触发触发器的执行,自动运行另一段的sql代码 创建触发器的语法 # 创建两张表create

mysql数据库-进阶-长期维护

雨燕双飞 提交于 2020-02-08 01:49:08
############### 视图 ############## """ 1.视图 视图:是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据 视图有如下特点; 1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系。 2. 视图是由基本表(实表)产生的表(虚表)。 3. 视图的建立和删除不影响基本表。 4. 对视图内容的更新(添加、删除和修改)直接影响基本表。 5. 当视图来自多个基本表时,不允许添加和删除数据。 1.创建视图 create view 视图名称 as sql 查询语句 2.使用视图 select * from 视图名称; 3.更新视图 alter view 视图名称 AS SQL语句 4. 删除视图 drop view ren_view; """ ############### 触发器 ############## """ 2.触发器-trigger 触发器:监视某种情况,并触发某种操作。 触发器创建语法四要素: 1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete) 1.创建触发器语法 create trigger triggerName after/before insert/update

Spring之事务

筅森魡賤 提交于 2020-02-08 01:27:01
事务 事务(Transaction)就是为了保证数据完整性。 特性 原子性(Atomicity,或称不可分割性): 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节 一致性(Consistency): 事务必须使数据库从一个一致性状态到另外一个一致性状态,一致性和原子性是密切相关的 隔离性(Isolation,又称独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,一个事务不能被其它事务所干扰 持久性(Durability):事务提交后,数据永久存在数据库中 传播属性(Propagation) 事务的传播属性是指在多个事务同时存在时,事务之间的处理关系 常 量 解释 REQUIRED 支持当前事务,如果不存在则创建新事务。类似于同名的EJB事务属性。这是事务注释的默认设置。 SUPPORTS 支持当前事务,如果不存在事务,则以非事务方式执行。 MANDATORY 支持当前事务,如果不存在则抛出异常。 REQUIRES_NEW 创建一个新事务,如果存在当前事务,则挂起它。 NOT_SUPPORTED 以非事务方式执行,如果当前事务存在,则挂起当前事务。内外事务为独立事务,互不影响 NEVER 以非事务方式执行,如果存在事务,则抛出异常。 NESTED 如果当前事务存在,则在嵌套事务中执行,否则就像REQUIRED一样

MySQL数据库集群实战(3)——MySQL主从复制之半同步复制

半世苍凉 提交于 2020-02-08 01:04:26
文章目录 一、掌握Mysql复制方式的区别及优缺点 二、了解半同步复制出现的必要性 半同步工作原理 三、配置半同步复制 实验环境 一、掌握Mysql复制方式的区别及优缺点 异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完 全同步复制(Fully synchronous replication) 指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。 半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。 在2010年MySQL 5.5版本之前,一直采用的是这种异步复制的方式

MySQL 日志

梦想的初衷 提交于 2020-02-07 21:37:59
MySql 中有六种日志文件:重做日志(redo log),回滚日志(undo log),二进制日志(bin log),错误日志(errlog),慢查询日志(slow query log),一般查询日志(general log),中继日志(relay log)。 这其中重做日志和回滚日志与事务操作息息相关,二进制日志与事务操作有一定关系,这篇文章我们来看看这三种日志能做什么。 重做日志(redo log) 作用:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,重启 mysql 服务的时候,会根据 redo log进行重做,从而达到事务的持久性这一特性。 内容:物理格式的日志,记录的是物理数据页面的修改信息,其 redo log 是顺序写入 redo log file 的物理文件中去的。 产生时间:事务开始后就产生了 redo log。在事务执行的过程中,便开始写入 redo log 文件中。 释放:当对应事务的脏页写入到磁盘之后,redo log 的使命也就完成了。 回滚日志(undo log) 作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。 内容:逻辑格式的日志,在执行 undo 的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现。 产生时间:事务开始之前,将当前版本生成 undo

大数据之Zookeeper(上)

隐身守侯 提交于 2020-02-07 20:55:29
1 分布式概述 早起我们使用单体架构,即所有的服务都部署在一台服务器的一个进程中,随着互联网的发展,逐步演进为分布式架构,多个服务分别部署在不同机器的不同进程中。 2 Zookeeper概述 Zookeeper是一个开源的分布式协调服务,提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅、负载均衡、命名服务、集群管理分布式锁、分布式队列等功能。 Zookeeper提供了分布式数据一致性的解决访问,那么什么是分布式数据一致性? 如上图所示,有用户user在DB1中修改balance为900,如果user下一次read请求到DB2数据库的时候,此时DB1数据库的数据还没及时更新到DB2中,就会造成整个数据库集群数据不一致。 数据一致性分为强一致性和最终一致性,强一致性指的是如果数据不一致,就不对外提供数据服务,保证用户读写的数据始终是一致的。数据强一致性值需要通过锁机制即可解决,在案例中通过在DB2没有从DB1同步数据之前上锁,不对外提供读操作。只要当同步完成以后才对外提供服务。而最终一致性要求数据最终同步即可,没有实时要求。 3 CAP原则 CAP在分布式系统中主要指的是一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)。 一致性:一致性指的就是强一致性。 可用性:系统提供的服务一直处于可用状态

数据库事务的四大特性以及隔离级别

此生再无相见时 提交于 2020-02-07 15:51:54
本篇文章主要介绍数据库事务的四大特性ACID,以及数据库的隔离级别。 事务 概念 事务指的是满足 ACID 特性的一系列操作。在数据库中,可以通过 Commit提交一个事务,也可以使用 Rollback 进行回滚。 四大特性 原子性(Atomicity):事务被视为不可分割的最小单元,要么全部提交成功,要么全部失败回滚。 一致性(Consistency):事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。 隔离性(Isolation):一个事务所做的修改在最终提交以前,对其它事务是不可见的。 持久性(Durability):一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。 在了解完数据库的四大特性之后,我们来讨论一下数据库的隔离级别的问题。在此之前,我们考虑在没有数据库隔离性的情况下,多用户并发操作可能会发生的问题。 并发一致性问题 在并发环境下,一个事务如果受到另一个事务的影响,那么事务操作就无法满足一致性条件。 丢失修改:多个事务同时读取某一数据,一个事务成功处理好了数据,被另一个事务写回原值,造成第一个事务更新丢失。例如,T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。 脏读

java事务理解

六月ゝ 毕业季﹏ 提交于 2020-02-07 15:43:10
还在学Hibernate,后续一大堆概念刚接触需要理解。觉得-——事务——这个概念不是很好理解,所以发上来记录一下。 首先说点千篇一律的东西。概念和特性都是随处可见的,无论哪里都很容易找到,关键是你如何去理解它。 概念:事务(Transaction)是访问并可能更新数据库中各种 数据项 的一个程序执行单元(unit)。事务通常由 高级数据库 操纵语言或编程语言(如SQL,C++或Java)书写的 用户程序 的执行所引起,并用形如begin transaction和end transaction语句(或 函数调用 )来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 例如:在 关系数据库 中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。 特性: 事务是恢复和 并发控制 的基本单位。 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰

MySQL事务提交过程(一)

霸气de小男生 提交于 2020-02-07 15:38:18
MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中。今天我们来讨论下事务的提交过程。 MySQL体系结构 由于mysql插件式存储架构,导致开启binlog后,事务提交实质是二阶段提交,通过两阶段提交,来保证存储引擎和二进制日志的一致。 本文仅讨论binlog未打卡状态下的提交流程,后续会讨论打开binlog选项后的提交逻辑。 测试环境 OS:WIN7 ENGINE: bin-log:off DB: 测试条件 set autocommit=0; -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(20) NOT NULL, `account` varchar(20) NOT NULL, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`), KEY `id` (`id`) USING BTREE, KEY `name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 测试语句 insert into

pymysql操作数据库

筅森魡賤 提交于 2020-02-07 12:12:30
数据库连接 import pymysql #打开数据库连接 db = pymysql.connect('localhost','user','password','dbname') #使用cursor()方法创建一个游标对象 cursor cursor = db.cursor() #使用execute()方法执行SQL语句 cursor.execute('select version()') 使用fetchone()方法获取单条数据 data = cursor.fetchone() print('Database version : %s'%data) #关闭数据库 db.close() 创建数据库表 #如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表EMPLOYEE: import mysql db=pymysql.connect('localhost','username','password','dbname') cursor = db.cursor() sql = """ create table employee( first_name char(20), list_name char(20), age int, sex char(1), income float )""" cursor.execute(sql) db.close()