事务隔离级别

mysql三:表操作

旧街凉风 提交于 2020-02-16 08:13:26
阅读目录 一 存储引擎介绍 二 表介绍 三 创建表 四 查看表结构 五 数据类型 六 表完整性约束 七 修改表ALTER TABLE 八 复制表 九 删除表 一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 1. 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的 表 ===> 文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 :比如处理文本用txt类型,处理表格用excel,处理图片用png等 数据库中的表也应该有不同的类型, 表的类型不同 ,会对应mysql不同的 存取机制 ,表类型又称为 存储引擎 。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方 法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和 操作此表的类型) 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 自己的需要编写自己的存储引擎 SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL

Hibernate的缓存

人盡茶涼 提交于 2020-02-16 05:43:10
参考文章: 关于hibernate的缓存使用 这篇博文已经说的很详细,不过我这里还有一些补充说明的。 —————————————————————————————————————————————— Hibernate持久层缓存的级别: (1)事务级别 该级别缓存中的缓存对象只能被当前事务使用,每个事务都有各自的缓存,缓存中的数据通常以关联对象的形式保存。同时被缓存对象的生命周期依赖于当前事务的生命周期,当前事务结束时,该缓存中缓存对象的生命周期也会结束。事务级别的缓存通常使用内存作为保存缓存对象的存储介质,Hibernate的一级缓存(Session缓存)即该级别的缓存。 (2)应用(进程)级别 该级别缓存中对象可以被当前应用(进程)内的所有事务共享访问,被缓存对象的生命周期与当前应用相同。当应用结束时,缓存对象的生命周期结束。如果当前应用是一个分布式应用,则不能使用该级别的缓存,这种级别的缓存使用内存或硬盘作为缓存对象的存储介质。 (3)分布式级别 如果当前应用部署在多台服务器的分布式(集群)环境下,则当前应用可以使用分布式级别的缓存缓存持久化对象。分布式缓存中缓存的数据会被一台或者多台服务器共享。如果缓存数据发生变化,则更新后的缓存数据会同步到集群中的每台服务器中,进而保证缓存数据的一致性。 Hibernate的二级缓存可以是应用级别或者分布式级别的缓存

MySQL 中的事务

浪尽此生 提交于 2020-02-16 04:32:22
事务的应用场景说明 什么是事务: 在实际的开发过程中,一个业务操作如:转账,往往是要多次访问数据库才能完成的。转 账是一个用户扣钱,另一个用户加钱。如果其中有一条 SQL 语句出现异常,这条 SQL 就可能执行失败。 事务执行是一个整体,所有的 SQL 语句都必须执行成功。如果其中有 1 条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败。 案例说明 转账的操作 -- 创建数据表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('LeeHua', 1000), ('Tom', 1000); 模拟LeeHua给Tom转 500 元钱,一个转账的业务操作最少要执行下面的 2 条语句: -- LeeHua账号-500 UPDATE account SET balance = balance - 500 WHERE name='LeeHua'; -- Tom账号+500 UPDATE account SET balance = balance + 500 WHERE name='Tom'; 假设当LeeHua账号上 -500

Spring事务管理

£可爱£侵袭症+ 提交于 2020-02-15 11:05:06
1、事务( https://www.cnblogs.com/zhai1997/p/11710082.html ) (1)事务的特性:acdi (2)事务的并发问题:丢失修改,脏读,不可重复读 (3)事务的隔离级别:1、2、4、8 2、Spring的事务管理 (1)Spring封装了事务管理的代码:打开事务、提交事务、回滚事务 在我们学习的不同阶段(JDBC、Hibernate),对事物处理的方法是不一样的,为了解决这个问题,Spring提供了一个接口,PlatformTransactionManager(平台事务管理器), 该接口可以根据不同的平台提供不同的方法来处理事务, (2)Spring管理事务的属性 事务的隔离级别:1:读未提交、2:读已提交、4:可重复读、8:串行化 本次事务是否只读:true:只读 事务的传播行为: PROPAGATION REQUIRED 支持当前事务,如果不存在就新建一个(默认) PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务PROPAGATION MANDATORY 支持当前事务,如果不存在,抛出异常PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务PROPAGATION

隔离级别的实现原理

孤者浪人 提交于 2020-02-14 18:37:06
隔离级别的实现原理 https://www.cnblogs.com/wade-luffy/p/8686883.html#_label7 目录 排他锁(Exclusive Lock) 共享锁(Share lock) “丢失修改”的问题 读未提交(最低的事务隔离级别)-脏数据 读已提交-不可重复读 可重复读-幻读 Serializable (串行化) MVCC(多版本并发控制) 原理 流程变化 回到顶部 排他锁(Exclusive Lock) 排他锁(Exclusive Lock) , 简称 X锁。 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。 规则1 :写 一个数据之前加X锁, 事务提交之后释放该X锁。 回到顶部 共享锁(Share lock) 共享锁(Share lock) ,简称S锁, 这个锁和之前的排他锁X锁有区别, 主要用于读取数据。 如果一个数据加了X锁, 就没法加S锁,没法再加X锁。 如果一个数据加了S锁, 就可以加S锁,没法再加X锁。 规则1 : 读一个数据之前加S锁, 读完之后立刻释放该S锁。 规则2 : 读一个数据之前加S锁, 事务提交之后立刻释放该S锁。 回到顶部 “ 丢失修改 ”的问题 事务1的修改被事务2的修改覆盖了

实现spring事务的四种方式

回眸只為那壹抹淺笑 提交于 2020-02-14 17:08:57
用一个银行账号转钱的案例来说明spring事务的实现。 在转钱过程中,一个账号钱增加,另一个减少,那么当有异常产生时,就会出现钱转丢了的现象 一个减少了,而另一个没有增加,这个时候就需要把这两个行为绑定到一起,要么同时发生,要么都不发生 这就用到了事务,事务就是指在逻辑上的一组操作,这组操作要么全部成功,要么全部失败 实现spring事务的四种方式分别为: (1)编程式事务管理:需要手动编写代码,在实际开发中很少使用 (2)声明式事务管理: (2.1)基于TransactionProxyFactoryBean的方式,需要为每个进行事务管理的类做相应配置 (2.2)基于AspectJ的XML方式,不需要改动类,在XML文件中配置好即可 (2.3)基于注解的方式,配置简单,需要在业务层类中添加注解 (2.2)和(2.3)在开发中使用比较多,前者配置一目了然,可以在XML文件中得到所有信息,后者配置简单方便 需要做的一些准备工作: 1.在数据库中新建一张account数据表 SQL脚本: CREATE TABLE `account` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `money` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE

事务与存储过程

Deadly 提交于 2020-02-14 14:03:01
事务管理 事务是针对数据库的一组操作,它可以由一条或多条SQL语句组成 【注意:事务中的语句要么都执行,要么都不执行】 先创建一个表 开启事务 START TRANSACTION; 提交事务并查看 COMMIT; 当用户确认提交后,事务中的操作才会执行成功,这个过程就是手动提交的过程 直接查看 退出数据库再查看 事务的四大特性 1.原子性:是指一个事务必须被视为一个不可分割的最小工作单元。只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,任何一个SQL语句执行失败,都会退回到执行事务前的状态。 2.一致性:是指事务将数据库从一种状态转变为下一种一致的状态。例如,在表中有一个字段具有唯一约束,但事务对其进行了修改,使其变得不唯一了,这就破坏了事务的一致性要求,如果事务中的某个动作失败了,系统可以自动撤销事务,返回初始化的状态。 3.隔离性:还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 4.持久性:事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。 回滚事务

深入理解Spring事务的那点事

亡梦爱人 提交于 2020-02-14 11:35:40
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真正的数据库层的事务提交和回滚是通过binlog或者redo

innodb解决幻读

只愿长相守 提交于 2020-02-12 12:45:15
1. 结论 首先说结论,在RR的隔离级别下,Innodb使用MVVC和next-key locks解决幻读,MVVC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。 2. 幻读是什么 事务A,先执行: update table set name=“hh” where id>3; 结果为: OK row xx 表名成功影响多少行数据 事务B,后执行,并且提交: insert into table values(11, uu); commit; 事务A,然后再select一下: select * from table where id>3 结果集为: … 11,uu … 事务A懵了,我特么不是id>3全部更新了吗 这次是已提交事务B对事务A产生的影响,这个影响叫做“幻读”。 幻读和不可重复读的区别是,前者是一个范围,后者是本身 3. 怎么解决的? 3.1. 当前读 所谓当前读,指的是加锁的select(S或者X), update, delete等语句。在RR的事务隔离级别下,数据库会使用next-key locks来锁住本条记录以及索引区间。 拿上面那个例子来说,在RR的情况下,假设使用的是当前读,加锁了的读 select * from table where id>3 锁住的就是id=3这条记录以及id>3这个区间范围,锁住索引记录之间的范围

Spring的事物实现方式

一笑奈何 提交于 2020-02-12 11:50:51
Spring事务的实现方式主要有以下4种: 1)编程式事务:代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法; 2)基于 TransactionProxyFactoryBean的声明式事务管理; 3)基于 @Transactional 的声明式事务管理; 4)基于Aspectj AOP配置事务。 举例说明事务的不同实现: 说明:编程式事务基本已经淘汰。 /** * 账户对象 * */ public class Account { private int accountid; private String name; private String balance; public int getAccountid() { return accountid; } public void setAccountid(int accountid) { this.accountid = accountid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBalance() { return balance; } public void