mysql事务

理解乐观锁与悲观锁

坚强是说给别人听的谎言 提交于 2020-03-16 08:05:44
  DBMS中并发控制的任务是确保多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性   乐观锁和悲观锁是并发控制主要采用的技术手段。   无论是乐观锁还是悲观锁,都是人们定义出来的概念,可以认为是一种思想。其实不仅仅是关系型数据库中有乐观锁和背锅所的盖面,其他很多地方都有类似的概念。   针对不同的业务场景,应该选用不同的并发控制方式,所以,不要把乐观锁和悲观锁下一的理解为DBMS中的概念,更不要把他们和数据库中提供的锁机制混为一谈。其实,在DBMS中,悲观锁正式利用数据库本身的锁机制来实现的。   悲观锁   在关系数据库中,悲观锁是一种并发控制的方法,它可以组织一个事务一影响其他用户的方式来修改数据。如果一个事务执行的操作嗾使某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。   悲观锁主要用于数据征用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回滚事务的成本的环境中。   悲观锁指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往一句数据库提供的锁机制(也只有数据库层提供的锁机制擦能真正保证数据访问的排他性,否则,及时在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)   在数据库中

Spring事务传播及数据库事务操作

不羁岁月 提交于 2020-03-15 09:27:33
从Spring 事务配置说起   先看看Spring 事务的基础配置 <aop:aspectj-autoproxy proxy-target-class="true"/>   <bean id="transactionManager"     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     <property name="dataSource" ref="dataSource"/>   </bean>   <tx:annotation-driven transaction-manager="transactionManager"/>   <!-- 配置事务传播特性-->   <tx:advice id="transactionAdvice" transaction-manager="transactionManager">     <tx:attributes>       <tx:method name="add*" propagation="REQUIRED"       rollback-for="Exception,RuntimeException,SQLException"/>       <tx:method name="remove*" propagation=

Spring事务的一些特性

本小妞迷上赌 提交于 2020-03-15 09:23:08
事务的四大特征 1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做 2.一致性:数据不会因为事务的执行而遭到破坏 3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰 4.持久性:一个事物一旦提交,它对数据库的改变就是永久的 五个隔离级别 1.default:默认的事务隔离级别,跟具体的数据有关,mysql默认的事务隔离级别是repeatable_read 2.read_uncommitted: 读未提交,一个事务可以感知或者操作另外一个未提交的事务,可能会出现脏读、不可重复读、幻读 3.read_committed:读已提交,一个事务只能感知或者操作另一个已经提交的事务,可能会出现不可重复读、幻读 4.repeatable_read:可重复读,能够避免脏读,不可重复读,不能避免幻读 4.serializable:串行化,隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,幻读。 七个传播特性 1、Propagation.REQUIRED 调用方已经存在事务,则加入到同一个事务中运行,否则,自启一个事务 2、Propagation.REQUIRES_NEW 无论何时自身都会开启新事务 3、Propagation.SUPPORTS 调用方存在事务,则加入到同一个事务中运行,若不存在事务,则以非事务的方式运行 4

Spring中的事务管理

北慕城南 提交于 2020-03-15 09:20:16
一、事务简介 事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四个关键属性(ACID) 原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用. 一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中. 隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏. 持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中 Spring 中的事务管理 作为企业级应用程序框架,Spring 在不同的事务管理 API 之上定义了一个抽象层. 而应用程序开发人员不必了解底层的事务管理 API, 就可以使用 Spring 的事务管理机制. Spring 既支持编程式事务管理, 也支持声明式的事务管理. 编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码. 声明式事务管理:

mysql共享锁与排他锁

对着背影说爱祢 提交于 2020-03-14 23:40:26
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行 数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类 型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ..

子查询/联合分组/all与any/视图/事务

纵然是瞬间 提交于 2020-03-14 03:41:14
子查询 将一条查询sql的结果作为另一条sql的条件 使用方法总结: # 增:insert into 表 select子查询 # 删:delete from 表 条件是select子查询(表不能与delete表相同) # 查:select 字段 from 表 条件是select子查询 # 改:update 表 set 字段=值 条件是select子查询(表不能与update表相同) 联合分组: 按多个字段综合结果进行分组 使用方法总结: # 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组 select group_concat(name),area,port from emp group by area,port; 区间修饰条件(all与any): 使用方法总结: # 语法规则 # where id in (1, 2, 3) => id是1或2或3 # where id not in (1, 2, 3) => id不是1,2,3 # where salary < all(3, 6, 9) => salary必须小于所有情况(小于最小) # where salary > all(3, 6, 9) => salary必须大于所有情况(大于最大) # where salary < any(3, 6, 9) => salary只要小于一种情况(小于最大)

【读书笔记】数据库

你离开我真会死。 提交于 2020-03-13 21:00:27
这里是整理了数据库的一些常见问题,以及基本命令 1、数据库中的事务 数据库事务是数据库运行中的逻辑工作单位,单个逻辑工作单元所执行的一系列操作,要么都执行,要么都不执行。 2、数据库事务的四大特性(ACID) 原子性(Atomicity):一件事务要么提交成功,要么全部失败回滚 一致性(Consistency):事务执行前后都保持一致性原则 隔离性(Isolation):事务提交之前它对其他所有事务不可见。通过乐观锁和悲观锁实现 持久性(Durability):一旦事务提交,所做修改永久保存到数据库中 3、数据库的锁 乐观锁:假设不会发生冲突,直到事务提交时才检查是否违反了完整性(通过数据 版本或者时间戳实现;添加version字段,每做一次操作就让version+1,提交时进行对比) 悲观锁:假设一定会发生冲突,屏蔽一切可能违反完整性的操作(synchronized就是悲观锁) 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁。获准共享锁的事务只能读数据,不能修改数据。 排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 4、数据库优化 (1)sql语句的优化 子查询变成left join or条件优化,多个or条件可以用union all对结果进行合并

MySQL相关知识

一世执手 提交于 2020-03-12 11:58:06
目录 1. MySQL背景介绍 2. MySQL发展史 3. MySQL分支介绍 4. MySQL的优点 5. MySQL数据库组成 6. MySQL的原理 7. MySQL执行流程 8. MySQL日志 9. MySQL事务、锁、索引与SQL优化 ## MySQL背景介绍 随着互联网企业的兴起,例如阿里巴巴、网易、Yahoo、Facebook等大型互联网公司的推动,目前Mysql已经成为世界上最流行的数据库,并一步步开始占领了原有商业数据库的市场,目前Mysql已经成为互联网公司甚至部分传统公司的首选数据库。 ## MySQL发展史 最初为AB公司的产品,Mysql5.0及之前的版本均由AB公司管理,在2008年的时候AB公司被Sun公司收购,Mysql也就归属到了Sun公司下,但在Sun还没待多久,Sun公司就被Oracle公司收购了,此期间诞生了一个Sun向Oracle的过渡版本:Mysql5.5(5.1-5.5之间没有发布过版本),直至5.6Mysql就彻底归属于Oracle公司旗下了,从Oracle收购Mysql以来,Mysql发展的速度及新的功能越来越强大,逐步向Oracle靠拢,如:表空间、redo、undo分离、隐藏索引,至2019年,Mysql8.0.15已经GA(官方发布稳定版本),整体发展过程如下(AB版本不做加入): 5.1 → 5.5 → 5.6 → 5

笔记:MySQL相关知识

孤街醉人 提交于 2020-03-12 09:03:48
MySQL背景介绍 MySQL发展史 MySQL分支介绍 MySQL的优点 MySQL数据库组成 MySQL的原理 MySQL执行流程 MySQL日志 MySQL事务、锁、索引与SQL优化 MySQL背景介绍 随着互联网企业的兴起,例如阿里巴巴、网易、Yahoo、Facebook等大型互联网公司的推动,目前Mysql已经成为世界上最流行的数据库,并一步步开始占领了原有商业数据库的市场,目前Mysql已经成为互联网公司甚至部分传统公司的首选数据库。 MySQL发展史 最初为AB公司的产品,Mysql5.0及之前的版本均由AB公司管理,在2008年的时候AB公司被Sun公司收购,Mysql也就归属到了Sun公司下,但在Sun还没待多久,Sun公司就被Oracle公司收购了,此期间诞生了一个Sun向Oracle的过渡版本:Mysql5.5(5.1-5.5之间没有发布过版本),直至5.6Mysql就彻底归属于Oracle公司旗下了,从Oracle收购Mysql以来,Mysql发展的速度及新的功能越来越强大,逐步向Oracle靠拢,如:表空间、redo、undo分离、隐藏索引,至2019年,Mysql8.0.15已经GA(官方发布稳定版本),整体发展过程如下(AB版本不做加入): 5.1 → 5.5 → 5.6 → 5.7 → 8.0 MySQL分支介绍 MySQL 是一个开源数据库

MySQL 事务的隔离级别

偶尔善良 提交于 2020-03-12 02:40:39
1. 事务的ACID 事务的ACID是指事务拥有的4个特性的首字母组合:atomicity(原子性), consistency(一致性), isolation(隔离性)和durability(持久性)。 ①atomicity(原子性) :表示事务是一个不可分割的工作单元,要么在提交事务后所有更改成功,要么在回滚事务时撤消所有更改,不可以只执行其中的一部分操作。 ②consistency(一致性) :在每次提交、回滚之后或正在进行的事务,数据库始终保持一致状态。如正在跨多个表更新相关数据,则查询看到的将是所有旧值或所有新值,而不是新值和旧值的混合。 ③isolation(隔离性) :事务在进行过程中相互隔离,他们不能互相干扰,也不能看到彼此的未提交数据。 但可以通过修改隔离级别,查看其他事务正在处理的数据。 ④durability(持久性) :事务提交成功后,该事务所做的更改将会保存在数据库中。 2. 并发读取数据的问题 当事务读取另一个事务已修改的数据时,可能会发生dirty read(脏读)、non-repeatable read(不可重复读)和phantom read(幻读)之类的现象。 ①dirty read(脏读) :当前事务读取了另一个事务已更新但尚未提交的数据。后果就是另一个事务回滚了,此数据就为错误的无效数据。 ②non-repeatable read(不可重复读)