数据库事务

[置顶] Oracle数据操作和控制语言详解

故事扮演 提交于 2020-02-14 22:56:41
SQL 语言共分为四大类:数据查询语言 DQL ,数据操纵语言 DML , 数据定义语言 DDL ,数据控制语言 DCL 。其中用于定义数据的结构,比如 创建、修改或者删除数据库; DCL 用于定义数据库用户的权限;在这篇文章中我将详细讲述这两种语言在 Oracle 中的使用方法。 DML 语言 DML 是 SQL 的一个子集,主要用于修改数据,下表列出了 ORACLE 支持的 DML 语句。 语句 用途 INSERT 向表中添加行 UPDATE 更新存储在表中的数据 DELETE 删除行 SELECT FOR UPDATE 禁止其他用户访问 DML 语句正在处理的行。 LOCK TABLE 禁止其他用户在表中使用 DML 语句 插入数据 INSERT 语句常常用于向表中插入行,行中可以有特殊数据字段,或者可以用子查询从已存在的数据中建立新行。 列目录是可选的,缺省的列的目录是所有的列名,包括 comlumn_id,comlumn_id 可以在数据字典视图 ALL_TAB_COLUMNS,USER_TAB_COLUMNS, 或者 DBA_TAB_COLUMNS 中找到。 插入行的数据的数量和数据类型必须和列的数量和数据类型相匹配。不符合列定义的数据类型将对插入值实行隐式数据转换。 NULL 字符串将一个 NULL 值插入适当的列中。关键字 NULL 常常用于表示将某列定义为

隔离级别的实现原理

孤者浪人 提交于 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

JDBC

我的未来我决定 提交于 2020-02-14 11:08:02
主要内容 1. JDBC基本概念 2. 快速入门 3. 对JDBC中各个接口和类详解 4. 数据库连接池 5. Spring JDBC : JDBC Template JDBC 1. 概念:Java DataBase Connectivity Java 数据库连接, Java语言操作数据库 * JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。 2. 快速入门: * 步骤: 1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar 1.复制mysql-connector-java-5.1.37-bin.jar到项目的libs目录下 2.右键-->Add As Library 2. 注册驱动 3. 获取数据库连接对象 Connection 4. 定义sql 5. 获取执行sql语句的对象 Statement 6. 执行sql,接受返回结果 7. 处理结果 8. 释放资源 * 代码实现: //1. 导入驱动jar包 //2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //3.获取数据库连接对象 Connection conn =

day29_JDBC

百般思念 提交于 2020-02-14 08:58:41
JDBC 概念 Java DataBase Connectivity Java 数据库连接, Java语言操作数据库。 JDBC本质 :其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。 JDBC 规范定义接口 ,具体的实现由各大数据库厂商来实现。JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。 JDBC 的好处: 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库 使用 JDBC 开发使用到的包: JDBC 的核心 API JDBC 访问数据库的步骤 1:注册和加载驱动 导入驱动 Jar 包 2:获取连接使用DriverManager类中的getConnection方法,获取连接对象 3:Connection连接对象 获取 Statement/getConnection 执行SQL 对象 4

分布式事务XA

匆匆过客 提交于 2020-02-14 02:56:10
1、什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 2、分布式事务的产生的原因 2.1、数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多个数据库。这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。 2.2、应用SOA化 所谓的SOA化,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心。对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。 以上两种情况表象不同,但是本质相同,都是因为要操作的数据库变多了! 3、事务的ACID特性 3.1、原子性(A) 所谓的原子性就是说

分布式事务XA

拟墨画扇 提交于 2020-02-14 02:55:41
1、什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 2、分布式事务的产生的原因 2.1、数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多个数据库。这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。 2.2、应用SOA化 所谓的SOA化,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心。对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。 以上两种情况表象不同,但是本质相同,都是因为要操作的数据库变多了! 3、事务的ACID特性 3.1、原子性(A) 所谓的原子性就是说

RESTORE 还原数据库

空扰寡人 提交于 2020-02-13 23:03:06
RESTORE (Transact-SQL) SQL Server 2008 R2 其他版本 还原使用 BACKUP 命令所做的备份。通过此命令,您可以执行下列还原方案: 基于完整数据库备份还原整个数据库(完整还原)。 还原数据库的一部分(部分还原)。 将特定文件或文件组还原到数据库(文件还原)。 将特定页面还原到数据库(页面还原)。 将事务日志还原到数据库(事务日志还原)。 将数据库恢复到数据库快照捕获的时间点。 有关 SQL Server 还原方案的详细信息,请参阅还原与恢复概述 (SQL Server) 和实现 SQL Server 数据库还原方案。 注意 有关参数说明的详细信息,请参阅 RESTORE 参数 (Transact-SQL)。 Transact-SQL 语法约定 语法 --To Restore an Entire Database from a Full database backup (a Complete Restore): RESTORE DATABASE { database_name | @database_name_var } [ FROM <backup_device> [ ,...n ] ] [ WITH { [ RECOVERY | NORECOVERY | STANDBY = {standby_file_name | @standby