数据库事务

事物、源码学习,spring-tx

邮差的信 提交于 2020-03-05 18:37:59
标签式配置,主要是标明回滚方法,超时,是否只读,以及隔离级别(不同session间事物的可见性,读取未提交,读取已提交,可重复读,序列化)及传播属性(定义了调用关系的事物传播行为 PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认);PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务;PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常;PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务;PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务;PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常;PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行) 具体实现 TransactionAspectSupport,基本原理就是读各种配置,加载对应的事物管理器,根据事物标签,处理各种传递、可见性、执行、回滚、异常等情况;事物间传递用TransactionInfo对象保留现场 protected Object invokeWithinTransaction(Method method, Class<?> targetClass, final

优化数据库

谁都会走 提交于 2020-03-05 16:29:44
1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL ,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2、使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:

Spring事务管理-@Transactional注解详解

瘦欲@ 提交于 2020-03-05 15:02:37
一、概念 首先事务 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务有 Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)四种特性,简称ACID四特性。 原子性 事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性 事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。 隔离性 指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。 持久性 指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。 二、Transactional注解原理 spring 在扫描bean的时候会扫描方法上是否包含

[Java面试十二]数据库概念相关

南楼画角 提交于 2020-03-05 12:54:02
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的 SQL 语句, 它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。 允许更快执行,如果某操作需要执行大量 SQL 语句或重复执行,存储过程比 SQL 语句执行的要快。 减少网络流量,例如一个需要数百行的 SQL 代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。 2. oracle的 存储过程和函数有什么区别? Oracle 中的函数与存储过程的 区别 : A: 函数必须有返回值 , 而过程没有 . B: 函数可以单独执行 . 而过程必须通过 execute 执行 . C: 函数可以嵌入到 SQL 语句中执行 . 而过程不行 . 其实我们可以将比较复杂的查询写成函数 . 然后到存储过程中去调用这些函数 . Oracle 中的函数与存储过程的 特点 : A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 C. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于 FROM 关键字的后面。 3. 什么是事务? 答

Spring面试笔记

时光总嘲笑我的痴心妄想 提交于 2020-03-05 12:04:54
1. Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring既是一个AOP框架,也是一IOC容器。 SpringFramework的组成:Spring AOP,Spring DAO,Spring ORM,Spring Web,Spring Context, Spring Web MVC。 Spring的核心就是IOC和AOP,所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制。 借助于Spring AOP,Spring IoC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终,能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置。 2. 说说AOP和IOC的概念以及在spring中是如何应用的? AOP,Aspect Oriented Program,面向(方面)切面的编程; IOC,Invert Of Control,控制反转。 简单说一下,IOC就是其实就是依赖注入,即用接口编程,在程序中不出现new关键字,而是用接口来命名引用,然后通过某种方式把接口的某个实现类的实例注入到引用里,从而实现接口与具体实现类的松耦合。 由容器控制程序之间的关系(通过XML配置),而非传统实现中的由程序代码直接操控,(在一个Class对象中引用另一个Class对象时

Python MySQL(MySQLdb)

可紊 提交于 2020-03-05 03:12:20
From: http://www.yiibai.com/python/python_mysql.html Python标准的数据库接口的Python DB-API(包括Python操作MySQL)。大多数Python数据库接口坚持这个标准。 Python标准的数据库接口的Python DB-API。大多数Python数据库接口坚持这个标准。. 你可以选择适合您应用的数据库。 Python 数据库API支持范围广泛的数据库服务器: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 下面是可用的Python数据库接口的列表: Python Database Interfaces and APIs 你必须下载一个单独的DB API的模块,你需要访问的每个数据库。例如,如果你需要访问Oracle数据库以及MySQL数据库,你必须下载Oracle和MySQL数据库模块. DB API提供了与数据库的工作,尽可能使用Python的结构和语法的最低标准。这个API包括以下: 导入API模块. 获取与数据库的连接. 发出SQL语句和存储过程. 关闭连接 我们这里将仅学习使用MySQL的所有概念,所以让我们来谈谈MySQLdb模块. 什么是MySQLdb?

MySQL之架构与历史(二)

大憨熊 提交于 2020-03-03 23:08:15
多版本并发控制 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。不仅是MySQL,包括Oracle、PostgreSQL等其他数据库系统也都实现了MVCC,但各自的实现机制不尽相同,因为MVCC没有一个统一的实习标准。 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。虽然实现机制不同,但大都实现了非阻塞的读操作,写操作也只锁定了必要的行。 MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。 前面说到不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。下面我们通过InnoDB的简化版行为来说明MVCC是如何工作的。 InnoDB的MVVC,是通过在每行记录后面保存两个隐藏列来实现的。一个保存了行的创建时间,一个保存了行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开启一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为当前事务的版本号

MySQL 事务及事务的隔离级别

回眸只為那壹抹淺笑 提交于 2020-03-03 20:01:07
什么是事务 通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态。 事务的特点(遵循ACID原则) 原子性(atomicity) :最小的执行单元。(要么全成功,有一条失败则回滚到最初状态)要么都执行,要么都回滚 一致性(consistrncy) :保证数据的状态操作前和操作后保持一致,即事务的执行使得数据库从一种正确状态转换为另一种正确的状态。 隔离性(isolation) :多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰 持久性(durability) :一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改 事务的作用 : 事务管理对于企业级应用而言至关重要,它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性。就像银行的自动提款机ATM,通常ATM都可以正常为客户服务,但是也难免遇到操作过程中及其突然出故障的情况,此时,事务就必须确保出故障前对账户的操作不生效,就像用户刚才完全没有使用过ATM机一样,以保证用户和银行的利益都不受损失。 相关步骤: 1、开启事务 2、编写事务的一组逻辑操作单元(多条sql语句) 3、提交事务或回滚事务 事务控制语句 : begin/ start transaction:开启事务 commit:提交事务 rollback:回滚事务

JDBC数据库事务管理

倖福魔咒の 提交于 2020-03-03 18:57:50
JDBC控制事务 使用Connection对象来管理事务 开启事务 :setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即可开启事务 提交事务:commit() 回滚事务: rollback 转账案例 package cn . itcats ; import cn . Utils . JDBCutils ; import java . sql . Connection ; import java . sql . PreparedStatement ; import java . sql . SQLException ; /** * JDBC控制事务 * 1.使用Connection对象来管理事务 * 开启事务 :setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即可开启事务 * 提交事务:commit() * 回滚事务: rollback * 转账案例 * */ public class JDBCdemo07 { public static void main ( String [ ] args ) { Connection conn = null ; PreparedStatement pre1 = null ; PreparedStatement pre2 = null ;

JDBC事务

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-03 09:15:37
如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。 对于简单的应用程序可能没有问题,但是有三个原因需要考虑是否关闭自动提交并管理自己的事务 - 提高性能 保持业务流程的完整性 使用分布式事务 事务能够控制何时更改提交并应用于数据库。 它将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。 要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,请调用 Connection 对象的 setAutoCommit() 方法。 如果将布尔的 false 传递给 setAutoCommit() ,则关闭自动提交。 也可以传递一个布尔值 true 来重新打开它。 例如,如果有一个名为 conn 的 Connection 对象,请将以下代码关闭自动提交 - conn.setAutoCommit(false); Java 提交和回滚 完成更改后,若要提交更改,那么可在连接对象上调用 commit() 方法,如下所示: conn.commit( ); Java 否则,要使用连接名为 conn 的数据库回滚更新,请使用以下代码 - conn.rollback( ); Java 以下示例说明了如何使用提交和回滚对象 - try{ //Assume a valid connection object conn conn