首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL事务隔离级别浅析

2、一致性(Consistency) 事务开始和结束后,能保证数据库完整性约束的正确性即数据的完整性。比如经典的转账案例,A向B转账,我们必须保证A扣了钱,B一定能收到钱。...比如A向一张银行卡转账,避免同一间过多的操作导致账户金额的缺损,所以A转入结束之前是不允许其他针对此卡的操作的。 4、持久性(Durability) 事务的对数据的影响是永久性的。...3、幻读 不好表述直接上例子吧: 仓库管理中,管理员要给刚到的一批商品进入库管理,当然入库之前肯定是要查一下之前有没有入库记录,确保正确性。...演示步骤: ① 新建两个session(会话,navicat中表现为两个查询窗口,mysql命令行中也是两个窗口),分别执行 select @@tx_isolation;//查询当前事务隔离级别...3、疑问总结 ① update,insert,delete操作为什么都是当前读? 简单来说,不执行当前读,数据的完整性约束就有可能遭到破坏。尤其高并发的环境下。

70810

Mybatis二级缓存,你确定要用么?

所以参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候...Executor对象中持有一个新的PerpetualCache对象;当会话结束,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。...2)查询要求的结果集中的结果范围。 3)这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )。...为什么避免使用二级缓存? 符合【Cache使用时的注意事项】的要求,并没有什么危害。 其他情况就会有很多危害了。 针对一个表的某些操作不在他独立的namespace下进行。...如果在UserMapper.xml中做了刷新缓存的操作,XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确

4.2K72
您找到你想要的搜索结果了吗?
是的
没有找到

mysql事务回滚机制概述

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,事务中,每个正确的原子 操作都会被顺序执行,直到遇到错误的原子操作...回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行update之前的记录还原。 因此,正确的原子操作是真正被执行过的,是物理执行。...事务是由一条或者多条sql语句组成,事务的操作中,要么这些sql语句都执行,要么都不执行。 事务的ACID特性:原子性,一致性,隔离性,持久性。...而当mysql server启动的时候,当我们需要查询auto_increment计数值,mysql便会自动执行:SELECT MIX(ID) FROM 表名 FOR UPDATE;这条语句来获得auto_increment...MYSQL中使用事务: MYSQL命令命令下事务都是自动提交的,即执行Sql语句就会马上执行COMMIT操作。

2.6K20

mysql事务回滚机制概述「建议收藏」

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,事务中,每个正确的原子 操作都会被顺序执行,直到遇到错误的原子操作...回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行update之前的记录还原。 因此,正确的原子操作是真正被执行过的,是物理执行。...事务是由一条或者多条sql语句组成,事务的操作中,要么这些sql语句都执行,要么都不执行。 事务的ACID特性:原子性,一致性,隔离性,持久性。...而当mysql server启动的时候,当我们需要查询auto_increment计数值,mysql便会自动执行:SELECT MIX(ID) FROM 表名 FOR UPDATE;这条语句来获得auto_increment...MYSQL中使用事务: MYSQL命令命令下事务都是自动提交的,即执行Sql语句就会马上执行COMMIT操作。

2.6K10

MySQL数据库对象与应用-MySQL进阶SQL应用单元测验

count(*)>2 ; 这个sql错误的地方是: A.order by 后面跟group by语句 B.album没有出现在select语句中 C.having条件中使用了count(*) D.这个...5、(单选)delimiterMySQL中的作用是: A.标识存储过程开始执行。 B.标识存储过程结束。 C.重置MySQL的命令结束符。 D.删除当前的MySQL分隔符。...6、(单选)下列关于触发器的说法,正确的是: A.table表上有一个insert相关的触发器,即使 insert into table执行失败了,触发器仍然会触发执行。...B.MySQL 5.5上一张表上最多只能建两个update相关的触发器。 C.可以一个t1表的before update触发器中执行update t1 的sql语句。...B.子查询不应该用圆括号括起。 C.子查询中OrderID应该用*代替。 D.上面所有都不正确

1.5K10

Mysql 日志管理(学习笔记九)

:使用mysqlbinlog读取二进制日志文件然后使用mysql命令还原到数据库中 注意还原必须是编号小的先还原 (9)使用二进制日志文件的pos号|时间点恢复 //先执行3条操作-> create...*/;//想回到什么哪条命令的状态,可以指定起始/结束pos号恢复# mysqlbinlog --start-position="120" --stop-position="217" mysql-bin...[=file_name]选项启动,mysql写一个包含了所有执行超过了long_query_time秒的SQL语句的日志。.../etc/my.cnf的[mysqld]下面添加 # 执行超过1秒的sql会被log下来 long_query_time=1 # 将查询执行时间较慢的语句进行记录 log-slow-queries=/...]选项(不建议使用) /etc/my.cnf中[mysqld]下面添加, # 更新查询 log-update=/var/lib/mysql/Dragonwake-update.log 出现如下错误:

39120

MySQL数据库(六):体系结构和存储引擎

一、mysql 体系结构 连接池:内存/cpu/进程数 管理工具:提供mysql数据库服务的软件自带的命令 sql接口:传递sql命令给mysqld进程 分析器:sql命令格式是否正确,对操作的库或者表是否有使用权限...优化器:优化执行sql语句,让系统使用最少的资源去执行sql命令 写(insert create update delete) 读(select) 缓存区:mysql数据库服务,会划分一定系统物理内存给...mysql服务做查询缓存 存储引擎:myisam innodb 文件系统:存储设备 /var/lib/mysql/DATABASENAME/TABLENAME....myisam ㈠存储方法 独享表空间,用不同的文件存储不同的数据. .frm文件存表结构 .MYD存记录 .MYI存储索引 ㈡功能 不支持外键,不支持事务,支持表锁 ㈢应用场景 查询比较多的一般使用...操作从开始到结束的过程 5.什么是事务回滚 若一次sql没有成功,就把sql操作的数据恢复到操作的状态 6.锁机制 为了解决并发访问的冲突问题 1.1 读锁(共享锁) 1.2 写锁(排它锁/互斥锁

1.2K80

非 996 删库跑路,发生在 update 上的悲剧

原本我以为事情就这么简单的结束了呢?谁知道被同事挖了一个大坑。他竟然不小心,使用 update 更新 SQL 的时候,把所有数据都更新了。...年前放假前 3 天的事故再现《泪奔,同事执行 update 语句没有添加 where 条件!》,大 Boss 回来非剥了我的皮不可。...当你把下面这条语句拿出来执行,会报错。无法执行。 ? 但当你把两条 SQL 合起来,用我上面的 in 的方式进行查询又不报错。...关于为什么只要子查询中取的字段是 order_item 中的字段就不报错的原因,目前网上还没有这类的文章介绍。...执行上面的语句之后,你会看到整条 SQL 被拆分成两次执行,还用到了 temporary 和 join。 ? 接着我们执行下面的 SQL 语句,看看结果。 ? ? 贴出来,如下所示: ?

52130

MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行 事务用来管理多条insert,update,delete语句 一般来说,事务是必须满足4个条件(ACID): Atomicity...开始一个事务 start transaction MySQL中,事务开始使用COMMIT或ROLLBACK语句开始工作和结束。开始和结束语句的SQL命令之间形成了大量的事务。...当一个成功的事务完成后,发出COMMIT命令应使所有参与表的更改才会生效。 如果发生故障,应发出一个ROLLBACK命令返回的事务中引用的每一个表到以前的状态。...AUTOCOMMIT设置为0,发出SET AUTOCOMMIT =0命令随后的一系列语句的作用就像一个事务,直到一个明确的COMMIT语句没有活动的提交。...幻读(Phantom Read):一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务接下来的查询中,就会发现有几列数据是它先前所没有

39610

两万字详解!InnoDB锁专题!

为什么存在脏读问题呢?这是因为在读未提交的隔离级别下执行写操作,并没有SQL加锁,因此产生了脏读这个问题。 我们再来看下,串行化隔离级别下,同样的SQL执行流程,又是怎样的呢?...(如上图步骤5、6) 自增锁是一个表级别锁,那为什么会话A事务还没结束,事务会话B可以执行插入成功呢?不是应该锁表嘛?...一个事务的INSERT-LIKE语句语句执行结束后释放AUTO_INC表级锁,而不是事务结束后释放。...因此c=10这个记录更新,不仅会有两把X锁,还会把区间(10,15)加间隙锁,因此要插入(12,12,12)记录,会阻塞。 3.8 查询条件列无索引+RR隔离级别 如果查询条件列没有索引呢?...我们用4.6的例子,然后给查询语句加个limit: Select * from t5 where c=10 limit 2 for update; 事务A、B执行如下: 发现事务B并没有阻塞,而是可以顺利执行

77730

盘点一下数据库的误操作有哪些后悔药?

(为了装逼,把自己也坑了,哈哈哈) 线上环境有时候需要通过命令行连接数据库,比如:mysql,你把sql语句复制过来后,命令行界面执行,由于屏幕滚动太快,这时根本无法确定sql是否都执行成功。...但没有怎么仔细检查,就把sql语句直接执行了。影响范围小还好,如果影响几万、几十万,甚至几百万行数据,我们可能要哭了。...也给自己一次测试sql是否正确,确认是否执行的机会。 4.操作数据sql加limit 即使通过上面的select语句确认了sql语句没有问题,执行后影响的记录行数是对的。...id=123; 7.操作数据之前先做备份 如果只是修改了少量的数据,或者只执行了一两条sql语句,通过上面的修改人和修改时间字段,需要回滚,能快速的定位到正确的数据。...修改完,3天之后,如果没有出现问题,就可以把临时表删掉了。 9.表名前面一定要带库名 我们sql为了方便,习惯性不带数据库名称。

76651

线上数据删错了,差点被老板开除

(为了装逼,把自己也坑了,哈哈哈) 线上环境有时候需要通过命令行连接数据库,比如:mysql,你把sql语句复制过来后,命令行界面执行,由于屏幕滚动太快,这时根本无法确定sql是否都执行成功。...但没有怎么仔细检查,就把sql语句直接执行了。影响范围小还好,如果影响几万、几十万,甚至几百万行数据,我们可能要哭了。...也给自己一次测试sql是否正确,确认是否执行的机会。 4.操作数据sql加limit 即使通过上面的select语句确认了sql语句没有问题,执行后影响的记录行数是对的。...id=123; 7.操作数据之前先做备份 如果只是修改了少量的数据,或者只执行了一两条sql语句,通过上面的修改人和修改时间字段,需要回滚,能快速的定位到正确的数据。...修改完,3天之后,如果没有出现问题,就可以把临时表删掉了。 9.表名前面一定要带库名 我们sql为了方便,习惯性不带数据库名称。

81211

【JavaEE进阶】MyBatis表查询

SQL注入是一种常见的安全漏洞,它利用了未正确过滤或转义用户输入的数据,导致恶意用户可以执行SQL查询插入恶意的SQL代码。...使用${}可以实现排序查询,而使用#{}就不能实现排序查询,因为当使用#{}查询,如果传递的值为String就会加单引号,就会导致sql错误. 缺点: 它的执行不安全,存在sql注入....SQL注入是一种常见的安全漏洞,它利用了未正确过滤或转义用户输入的数据,导致恶意用户可以执行SQL查询插入恶意的SQL代码。 查询数据库可以看到用户名和密码都是admin....@Insert,想要实现修改可以方法上添加@Update,然后将要执行sql语句写在这些注解的参数中即可。...open:指定循环开始的字符。 close:指定循环结束的字符。 separator:指定每个元素之间的分隔符。

28430

【JavaEE进阶】MyBatis表查询

SQL注入是一种常见的安全漏洞,它利用了未正确过滤或转义用户输入的数据,导致恶意用户可以执行SQL查询插入恶意的SQL代码。...使用${}可以实现排序查询,而使用#{}就不能实现排序查询,因为当使用#{}查询,如果传递的值为String就会加单引号,就会导致sql错误. 缺点: 它的执行不安全,存在sql注入....SQL注入是一种常见的安全漏洞,它利用了未正确过滤或转义用户输入的数据,导致恶意用户可以执行SQL查询插入恶意的SQL代码。 查询数据库可以看到用户名和密码都是admin....@Insert,想要实现修改可以方法上添加@Update,然后将要执行sql语句写在这些注解的参数中即可。...open:指定循环开始的字符。 close:指定循环结束的字符。 separator:指定每个元素之间的分隔符。

24730

mysql基本sql语句大全(基础用语篇)_mysql常用查询语句

注意:你必须首先登录到 MySQL 中,以下操作都是 MySQL 的提示符下进 行的,而且每个命令以分号结束 1、MySQL 常用命令 create database name; 创建数据库 use...另一个为.txt 文件,只包含数据, 且没有 sql 指令 5、可将查询存储一个文件中并告诉 mysql 从文件中读取查询而不是等待键盘输入。 可利用外壳程序键入重定向实用程序来完成这项工作。...如果你指定关键词 LOW_PRIORITY,UPDATE执行将被延迟,直到没有其它的客 户端正在读取表。...; 当查询优化器生成执行计划,会考虑索引,太多的索引会给查询优化器增加工作量, 导致无法选择最优的查询方案; 16、分析索引效率 方法:一般的 SQL 语句前加上 explain; 分析结果的含义:...,输出可能会很长; 21、使用查询缓存 1)查询缓存的工作方式: 第一次执行某条 select 语句,服务器记住该查询的文本内容和查询结果,存储缓 存中,下次碰到这个语句,直接从缓存中返回结果;当更新数据表后

2.9K30

真的坑,这个 MySQL 的 bug 99% 的人会踩!

客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库的整齐、高效。...事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。...锁定表 尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独立性,有时会影响数据库的性能,尤其是很大的应用系统中,由于事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束...包含有WRITE关键字的LOCKTABLE语句可以保证UNLOCKTABLES命令执行之前,不会有其它的访问来对inventory进行插入、更新或者删除的操作。...3.搜索字符型字段,我们有时会使用like关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。后者的查询速度明显比前者快得多。

55820

【MySQL】存储过程

文章目录 为什么使用存储过程 书写基本格式 关于参数 存储过程中开启事务 返回多个结果集 设置变量 存储过程:一段SQL语句的集合 为什么使用存储过程 1、解耦合。...作为后端开发人员,SQL是必备语言,但是如果条件允许,专业的事情交给专业的人来做。 2、命令短小。使用过就知道了。几十上百个字节的命令压缩成十几个字节,更不需要多次发送。...可能一项业务,需要先插入、再修改、再删除、再查询返回结果,本来四条命令,谁来写先不说,这四条命令哪条单拎出来不比一条存储过程调用命令长。 3、执行速度快。...如果在服务端发送多条命令到数据库执行,那可真说不准发到哪一条的时候线程就被叉出去了。...User set money=money-money_; commit; end$ 返回多个结果集 存储过程中如果执行了不下一次查询,会返回多个结果集。

7.9K30

MySQL锁

意思就是说MyISAM执行查询语句前,会自动给涉及的所有表加读锁,执行更新语句(增删改操作)前,会自动给涉及的表加写锁,这个过程并不需要用户干预。   ...这也就是为什么MyISAM表不适合大量更新操作应用的原因,因为大量更新操作可能导致查询操作很难获得读锁,从而长久阻塞,致使程序响应超时。...例子如下: LOCK TABLES tb_name WRITE;   UNLOCK TABLES;  注意:事务中锁表事务结束前不要释放锁,因为unlock tables会隐含提交事务,所以正确的做法是结束事务后再释放锁...查询哪些表正在被锁定: SHOW OPEN TABLES WHERE In_use > 0;   这个命令监控的是被表锁锁住的表,亲测如果用行锁,这个命令没有反应的,真的得自己动手实践才能发现真相。...事务执行过程中,随时都可以执行锁定,锁只有commit或者rollback的时候才会释放(这里说的是行锁哈^_^,表锁是不在存储引擎这层的),并且所有的锁是同一刻释放。

1.8K10

Mysql优化方面的面试题

查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确执行。 慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。...缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句执行的时候的 一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。...,但不一定被查询使用 key 显示MySQL查询中实际使用的索引,若没有使用索引,显示为NULL key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度 ref 表示上述表的连接匹配条件...当InnoDB启动,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。...看现在数据库执行什么sql语句,是否有语句长时间执行使数据库卡住; 3、执行show innodb engine status命令,查看数据库是否有锁资源争用; 4、查看mysql慢查询日志

80430

数据库(七)

视图是由一张表或多张表的查询结果构成的一张虚拟表,建立一张视图后会在数据库中保留一个以 frm 后缀结尾的文件,只保留了数据结果,所有的数据都来自 sql 语句。 为什么使用视图?...原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束中间某个环节,事务执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样...; 一致性:事务开始之前和事务结束以后,数据库的完整性没有被破坏。...持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 mysql 命令行的默认设置下,事务都是自动提交的,即执行 sql 语句后就会马上执行 commit 操作。...存储过程是一组任意的 sql 语句集合,存储 mysql 中,调用存储过程将会执行其包含的所有 sql 语句,与 python 中的函数类似。 为什么使用存储过程?

79820
领券