mysql事务

mysql中的事务隔离级别

▼魔方 西西 提交于 2019-12-05 08:27:33
事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典的、经常被拿出来说的例子就是转账了。假如小花要给小白转账1000元,这个转账会涉及到两个关键操作就是:将小花的余额-1000,将小白的余额+1000。但是万一在这两个操作之间突然出现了错误,比如银行系统突然断电,或突然宕机崩溃,都可能会导致小花的余额-1000之后,小白的余额却没有+1000,这样小花和小白就都不开心了。事务就是为了保证这两个关键操作要么都成功,要么都要失败的一个机制,都成功也就完成了转账,都失败也不会造成小花的损失。 事务的特性 事务是有四个特性(ACID)的,分别是原子性、一致性、隔离性和持久性。 原子性(Atomity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。 一致性(Consistency): 执行事务的前后,数据保持一致。 隔离性(Isolation): 并发访问数据库时,一个用户的事务不能被其他事务所干扰,各个并发事务对于数据库来说都是独立的。 持久性(Durable): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。 并发事务带来的问题 在典型的应用程序中,如果是多个事务并发运行,经常会出现多个事务操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)的场景。 虽然并发是必须的

数据库隔离机制

 ̄綄美尐妖づ 提交于 2019-12-05 07:36:57
所谓的数据库事务操作其实就是一组原子性的操作,要么全部操作成功,要么全部操作失败。 并行事务的四大问题: 1.更新丢失:和别的事务读到相同的东西,各自写,自己的写被覆盖了。(谁写的快谁的更新就丢失了) 2.脏读:读到别的事务未提交的数据。(万一回滚,数据就是脏的无效的了) 3.不可重复读:两次读之间有别的事务修改。 4.幻读:两次读之间有别的事务增删。 对应隔离级别 1.READ UNCOMMITTED:读未提交,不处理。 2.READ COMMITTED:读已提交,只读提交的数据,无脏读; 3.REPEATABLE READ:可重复读,加行锁,两次读之间不会有修改,无脏读无重复读; 4.SERIALIZABLE: 串行化,加表锁,全部串行,无所有问题。   1.READ UNCIMMITTED(未提交读)    事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。   2.READ COMMITTED(提交读)    首先大多数数据库系统的默认隔离级别是READ COMMITTED,这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取旧数据的现象   3.REPEATABLE READ(可重复读)    REPEATABLE READ解决了脏读的问题,该级别保证了每行的记录的结果是一致的

Mysql优化

穿精又带淫゛_ 提交于 2019-12-05 07:07:10
Mysql 是如何优化的? mysql 自带的查询缓存 使用 explain 添加在 select 查询语句前面 只要一条数据时可以加上 limit 1 避免 select * 为每张表设置主键 Id 尽可能使用 notnull 垂直分割表 MyISAM 不支持事务,但是每次查询都是原子性的 就是一个事务的所有操作要么全部成功,要么全部失败。 支持表级锁,每次操作都是对整个表加锁。 存储表的总行数 一个 MYISAM 表有三个文件:索引文件,表结构文件,数据文件。 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。 来源: https://www.cnblogs.com/lingboweifu/p/11912776.html

MySQL锁会不会,你就差看一看

 ̄綄美尐妖づ 提交于 2019-12-05 06:50:34
数据库锁知识 不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的。因为这些锁数据库隐式帮我们加了,只会在某些特定的场景下才需要手动加锁。 对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X) MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行增、删、改操作前,会自动给涉及的表加写锁,这个过程并不需要用户干预 表锁 首先,从锁的粒度,我们可以分成两大类: 表锁 :开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高 不同的存储引擎支持的锁粒度是不一样的==:InnoDB行锁和表锁都支持、MyISAM只支持表锁!InnoDB只有通过索引条件检索数据才使用行级锁==,否则,InnoDB使用表锁也就是说,InnoDB的行锁是基于索引的! 表锁下又分为两种模式: 表读锁(Table Read Lock)&& 表写锁(Table Write Lock) 从下图可以清晰看到,在表读锁和表写锁的环境下:读读不阻塞,读写阻塞,写写阻塞!读读不阻塞:当前用户在读数据,其他的用户也在读数据,不会加锁 读写阻塞

Python 操作MySQL 数据库

旧城冷巷雨未停 提交于 2019-12-05 06:08:54
Python 操作 MySQL 数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 你可以访问 Python数据库接口及API 查看详细的支持数据库列表。 不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。 DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。 Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。 Python DB-API使用流程: 引入 API 模块。 获取与数据库的连接。 执行SQL语句和存储过程。 关闭数据库连接。 什么是MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API

事务管理器的创建

人走茶凉 提交于 2019-12-05 05:22:36
package com.hope.utils;import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;/** * @author newcityman * @date 2019/11/21 - 20:34 */public class ConnectionUtils { private ThreadLocal<Connection> t1 = new ThreadLocal<Connection>(); private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } /** * 获取当前线程的连接 * @return */ public Connection getThreadConnection() { try { //1、从当前线程上获取连接 Connection conn = t1.get(); //2、判断当前线程上是否有连接 if (conn == null) { //3、从数据源中获取连接,并且存入到线程中 conn = dataSource.getConnection(); t1.set(conn

DJango中事务的使用

断了今生、忘了曾经 提交于 2019-12-05 05:07:44
Django 中事务的使用 Django默认的事务行为 默认情况下,在Django中事务是自动提交的。当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交。这种机制和数据库的自动提交事务机制类似。记住这里没有默认的回滚机制 在HTTP请求上加事务 对于Web请求,Django官方推荐使用中件间TransactionMiddleware来处理请求和响应中的事务。它的工作原理是这样的:当一个请求到来时,Django开始一个事务,如果响应没有出错,Django提交这期间所有的事务,如果view中的函数抛出异常,那么Django会回滚这之间的事务。 为了实现这个特性,需要在MIDDLEWARE_CLASSES setting中添加TransactionMiddleware: MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.transaction.TransactionMiddleware

事务

一曲冷凌霜 提交于 2019-12-05 05:05:55
1. 事务的基本介绍 1. 概念: * 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2. 操作: 1. 开启事务: start transaction; 2. 回滚:rollback; 3. 提交:commit; 3. 例子: CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000); SELECT * FROM account; UPDATE account SET balance = 1000; -- 张三给李四转账 500 元 -- 0. 开启事务 START TRANSACTION; -- 1. 张三账户 -500 UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan'; -- 2. 李四账户 +500 -- 出错了... UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi'; --

MySQL学习——事务

牧云@^-^@ 提交于 2019-12-05 04:25:58
MySQL学习——事务 摘要:本文主要学习了MySQL数据库的事务操作。 概念 什么是事务 事务是一组逻辑处理单位,可以是执行一条SQL语句,也可以是执行几个SQL语句。 事务用来保证数据由一种存储情况变为另一种情况,组成事务的各个单元要么都执行成功,要么都执行失败。 为什么使用事务 如果只是简单的一条SQL语句的执行,那么是不需要事务的,但在一些复杂的情况下,一个操作会涉及到多条SQL语句的执行,这种情况下就有必要保证所有的操作全部成功或者全部失败。 比如,小明给小红转账的一个操作,就会涉及到从小明账户扣钱和给小红账户充钱的两个操作。只有两个操作都成功执行了整个操作才算成功,这时就可以提交整个事务,可以说状态由转账前变到了转账后。否则有任何一个操作执行失败的话整个操作都要算做失败,这时就需要恢复事务,保证两个账户上的金额和转账前是一样的,表示恢复到了转账前的状态。 所以事务是为了保证一组操作的完整性而出现的,也是为了保证数据操作的安全。 基本术语 保存点(save point):指在事务执行前,或者事务执行后,数据在数据库里的一个存储情况,有时也会被称为状态。 回退(rollback):指撤销事务的操作,事务执行期间执行的操作都将失效,事务会恢复到上一个状态。 提交(commit):值提交事务的操作,事务期间执行的操作全部生效,事务进入一个新的状态。 支持使用事务的引擎 使用

MySQL架构

帅比萌擦擦* 提交于 2019-12-05 03:01:41
一、MySQL架构 第一层,即最上一层 ,所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。 第二层值得关注 。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。 第三层包括了存储引擎 。通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事 物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求。 连接管理和安全 在服务器内部,每个client连接都有自己的线程。这个连接的查询都在一个单独的线程中执行。这些线程轮流运行在某一个CPU内核(多核CPU)或者CPU中。服务器缓存了线程