mysql事务

事务的丢失更新

為{幸葍}努か 提交于 2019-11-30 21:45:51
我们都知道,Mysql Innodb引擎的默认事务隔离级别是RR可重复读,也就是在同一个事务中,多次读取相同的数据结果相同。而其底层就是通过:“排它锁+MVCC”来实现的。 话不多说,我们来看看下面的这个问题: 我们可以看到,上面的事务A在更新数据之前,数据已经被事务B所修改,但是事务A最终提交的时候,将事务B的提交覆盖掉了,导致了事务B的更新丢失。 用我们之前学过的MVCC来理解一下为什么这个问题会发生: 首先由于事务A开启的时候,事务B还没提交,此时A事务进行了一次select操作,导致生成ReadView。根据这张图的原理: B事务处于trx_ids的事务中,所以A事务无法看到B事务的数据处理过程,即B事务对数据的操作,对A事务不可见。这也正是可重复读的实现的原理。 而恰恰是因为A事务看不到B事务对数据的更新,而A事务本地无论如何都是读到该数据的1000元可重复读的版本,导致A事务后面的更新操作直接在1000元这个版本上对数据添加100,将B事务的更新完全覆盖。 那么如何解决上面的这个问题呢? 我们来看看上面问题的本质,其实就是在事务B操作数据之前,我们就调用了select,导致生成了ReadView,而我们又拿着这个select的数据去做后面的处理,最终导致了B数据的丢失。 看到这里可能有人会想

MySQL总结

99封情书 提交于 2019-11-30 21:29:50
MySql的主要存储引擎有哪些,主要区别? MYISAM INNODE MEMORY 区别: MYISAM: 它不支持事务,也不支持外键 INNODE: InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全.但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引 MEMORY: 使用存在内存中的内容来创建表 sql功能分类 DDL: 数据定义语言 用来定义数据库对象:创建库、表、列等 DML: 数据操作语言 用来操作数据表中的记录 DQL: 数据查询语言 用来查询数据 DCL: 数据控制语言 用来定义访问权限和安全级别 Mysql数据类型分三类 1.数值 2.字符串 3.时间日期 常见的数据类型: 1.double浮点型 2.char固定长度字符串 3.varchar可变长字符串类型 4.text长字符串 5.blob二进制类型 6.date日期类型格式为:yyyy-MM-dd 7.time时间类型格式为:hh:mm:ss DDL(数据定义语言) 1.创建数据库 create database 数据库名 charset=utf8; 2.使用(切换)数据库 use 数据库名; 3.添加一列 ALTER TABLE 表名 ADD 列名 数据类型; 4.删除一列 ALTER TABLE 表名 DROP 列名; 5.删除表

MySQL基础知识

自古美人都是妖i 提交于 2019-11-30 21:04:12
mysql的二进制日志 记录了所有对MySQL数据库的数据增删查改和对表和数据库的修改,需要在myc.cnf配置文件中进行配置 基于段的日志格式:binlog_format=STATEMENT 基于行的日志格式:binlog_format=ROW binlog_row_image=[FULL|MINIMAL|NOBLOB] 混合日志格式:binlog_format=MIXED 根据sql语句由系统决定使用基于段还是基于行的日志格式; 数据量的大小由所执行的sql语句决定 建议使用binlog_format=MIXED 或者 binlog_format=ROW并设置binlog_row_image=MINIMAL 查看二进制日志:mysqlbinlog -vv 日志文件名称,比如: mysqlbinlog -vv mysql-bin.000002 log_bin = mysql-bin # 开启及设置二进制日志文件名称 binlog_format = MIXED # 混合日志格式 sync_binlog = 1 # 二进制日志(binary log)同步到磁盘的频率 rpl_semi_sync_master_wait_point = after_sync expire_logs_days =7 #二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 数据库优化的几个方面 (1

事务4种隔离级别分析

柔情痞子 提交于 2019-11-30 19:16:52
数据库在并发的情况下,可能会出现脏读、不可重复读、幻读等问题。为了避免以上问题,数据库事务增加隔离级别,来保证数据的准确性。隔离级别从低到高有4个级别:未提交读(Read uncommitted)、提交读(Read committed)、可重复读(Repeatable read)、序列化(Serializable) 。 一、并发问题 1、 脏读 事务T1正在操作一条数据,此时事务T2获取该条数据纪录,如果T1异常,事务回滚,T2读取到的数据就是脏数据,这种现象称为脏读。 2、 不可重复读 事务T1多次读取某条记录,在读取间隔中,事务T2更新了该技术的数据,当T1再次读取该记录时,获取到的数据不一致,这种现象称为不可重复读。 产生的原因主要是数据的更新 。 3、幻读 事务T1批量处理多条记录,此时事务T2新增或删除了一条或多条记录,当T1处理完成,查询处理结果,会发现有记录没有处理(T2新增的)或者发现记录少了(T2删除的),会有一种幻觉的感觉,这种现象称为幻读。 主要是数据的新增或删除导致。 二、隔离级别 1、 未提交读(Read uncommitted) ①定义:就是一个事务读取到其他事务未提交的数据,是级别最低的隔离机制。 ②缺点:会产生脏读、不可重复读、幻读。 ③案例解读:以前交易所炒股的时候,股民老王购买了5000股,操作员操作录入(此时开启事务),操作时手误

jdbc事务和事务的隔离级别

拜拜、爱过 提交于 2019-11-30 19:16:35
在 jdbc的使用 中以最简单的jdbc的使用为例,说明了jdbc的具体用法。然而在通常项目中,需要考虑更多内容,例如事务。 事务,在单个数据处理单元中,存在若干个数据处理,要么整体成功,要么整体失败。事务需要满足ACID属性(原子性、一致性、隔离性和持久性)。 原子性:所谓原子性是指本次数据处理要么都提交、要么都不提交,即不能先提交一部分,然后处理其他的程序,然后接着提交未完成提交的剩余部分。概念类似于编程语言的原子操作。 一致性:所谓一致性是指数据库数据由一个一致的状态在提交事务后变为另外一个一致的状态。例如,用户确认到货操作:确认前,订单状态为待签收、客户积分为原始积分,此状态为一致的状态;在客户确认到后后,订单状态为已完成、客户积分增加本次消费的积分,这两个状态为一致状态。不能出现,订单状态为待签收,客户积分增加或者订单状态为已完成,客户积分未增加的状态,这两种均为不一致的情况。一致性与原子性息息相关。 隔离性:所谓隔离性是指事物与事务之间的隔离,即在事务提交完成前,其他事务与未完成事务的数据中间状态访问权限,具体可通过设置隔离级别来控制。 持久性:所谓持久性是指本次事务提交完成或者回滚完成均为持久的修改,除非其他事务进行操作否则数据库数据不能发生改变。 本文重点描述事物隔离性及使用方法。 要详细说明数据库隔离级别,需要先对数据库并发事务可能出现的几种状态进行说明: 读脏

MySq的事务的隔离级别

天涯浪子 提交于 2019-11-30 19:16:24
1.1 MySq的事务的隔离级别 MySql的定义四种隔离级别,每一种级别都规定了事务中的修改,哪些事务的内和事务间是可见的,还是不可见的。一般情况下较低的事务级别所需的开销较小,所以可以执行更高的并发。 READ UNCOMMITTED ( 未提交读 ): 未提交读是最低的隔离级别,事务的修改,即时它 没有提交 ,对 其他事务也是可见 的。导致事务可以读到未提交的数据,称之为 脏读 (Drity Read),而且它的性能并未比其他的级别好太多,所以在实际运用中很少采用此种隔离级别。 READ COMMITTED ( 提交读或者不可重复读 ): 大多数据库默认的级别是READ COMMITTED,但MySQL不是,READ COMMITTED 的含义就是在一个事务开始的时候,看不到其他的事务,也就是说在一个事务开始到提交的过程中的修改,对于其他的事务是不可见的。它可以 防止脏读 ,但不能防止幻读。因为执行两次一样的查询,结果可能不一样,所以又叫不可重复读。 REPEATABLE READ ( 可重复读 ) repeatable read 解决了脏读的问题,不可重复读问题。 是MySQL默认的事务级别 ,但是没有解决幻读的问题,在A事务中读取一个表某个范围内的记录,但另一个B事务在这张表中的该范围插入了新的记录,当之前的事务在次读取的时候,就会产生幻行。InnoDB、XtraDB

MySQL 事务及事务的隔离级别之脏读、不可重复读、幻读

谁都会走 提交于 2019-11-30 19:15:30
一、事务 1、事务的应用场景 在实际开发过程中,如果操作转账,往往要多次访问数据库才能完成。转账是一个用户扣钱,另一个用户加钱。如果有其中一条 SQL 语句出现异常,这条SQL语句就可能执行失败。 事务执行是一个整体,所有的SQL语句都必须执行成功,如果有其中一条 SQL 语句出现异常,则所有的 SQL都要回滚,整个业务执行失败。 2、案例: 模拟 加藤鹰 给 泷泽萝拉 转账500元 转账操作需要执行两条语句,则: 如果执行完第一条语句后,服务器崩溃了,那就造成了 加藤鹰的余额减少了500,而泷泽萝拉的余额并没有增加500。 只有当两条语句都执行成功的话,转账才算成功,这就用到了 事务 3、手动提交事务 4、自动提交事务 二、事务的原理 1、事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到 commit 命令后才会同步到数据表中,其他任何情况都会情况日志( rollback 断开连接) 2、原理图 3、事务的步骤 客户端连接数据库服务器,创建连接时创建此用户的临时日志文件 开启事务以后,所有的操作都会先写入到临时日志文件中 所有的查询操作都从表中查询,但会经过日志文件加工后才返回 如果事务提交则将日志文件中的数据写到表中,否则情况日志文件 三、事务的回滚点 1、回滚点 在某些成功的操作完成后,后续的操作又可能成功有可能失败,但是不管成功还是失败

记一次事务隔离级别引起的问题

牧云@^-^@ 提交于 2019-11-30 19:14:39
对于事务问题,其实也是很棘手的,特别是生产环境和测试环境不一样时最为头疼了。比如我最近遇到一个事务隔离级别的问题。先列一下事务的隔离级别吧。 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是 读已提交(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是 串行化(serializable) 否 否 否 而mysql默认的事务隔离级别为repeatable-read。具体事务细节参考 MySQL的四种事务隔离级别 ,我的问题也是在此文章的基础之上验证的。 我的问题场景是A项目调用B项目,两项目的通信使用的时HTTP,并且各自都开启了事务(数据库时公共的)。当B项目执行完并提交事务,A项目得到响应后去查询B项目的结果,但是查询不到。同事还做了不开启事务的测试,结果是可以查询到的,因此可以得知中间存在事务问题,并且查看了测试环境的事务隔离级别,数据库使用的是——repeatable-read,并且我们仔细检查了代码也没有特别针对事务进行设置,然而生产环境却没有这个问题。那么问题就来了,测试环境的事务隔离级别会是什么情况?为了查清这个问题,我们按照上面”MySQL的四种事务隔离级别“方式去尝试了一下,结果印证了这个问题。简单来说,在默认事务隔离级别情况下两个事务是独立的

mysql设置事务的隔离级别

做~自己de王妃 提交于 2019-11-30 19:14:10
关于事务的隔离性概念以及会引起的问题,还有解决方法,都在我另外的博客中详细讲过了,这里就不多说了,现在说mysql该怎么设置隔离级别的问题 mysql总共有四个隔离级别分别是:serialiable、repeatable read,read committed,read uncommitted。 set tx_isolation=''; 可以设置事务隔离级别,mysql默认的事务隔离级别是repeatable read 来源: CSDN 作者: jjkang_ 链接: https://blog.csdn.net/jjkang_/article/details/54925889

事务的隔离级别

帅比萌擦擦* 提交于 2019-11-30 19:13:57
事务的隔离级别 事务的四大特性分别是:原子性、一致性、隔离性、持久性 幻读和不可重复读都是在同一个事务中多次读取了其他事务已经提交的事务的数据导致每次读取的数据不一致,所不同的是不可重复读读取的是同一条数据,而幻读针对的是一批数据整体的统计(比如数据的个数) 以MYSQL数据库来分析四种隔离级别 第一种隔离级别:Read uncommitted(读未提交) 如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据 解决了更新丢失,但还是可能会出现脏读 第二种隔离级别:Read committed(读提交) 如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。 解决了更新丢失和脏读问题 第三种隔离级别:Repeatable read(可重复读取) 可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别