事务管理

事务JDBC模板

隐身守侯 提交于 2019-11-29 16:59:54
文章目录 Spring的AOP的基于AspectJ注解开发 Spring的基于AspectJ的注解的AOP开发 创建项目,引入jar包 引入配置文件 编写配置目标类 编写配置切面类 使用注解的AOP对象没有标类进行增强 Spring的注解的AOP的通知类型 @Before:前置通知 @AfterReturning:后置通知 @Around:环绕通知 @AfterThrowing:异常抛出通知 @After:最终通知 Spring的AOP的注解切入点的配置 Spring的JDBC的模版的使用 Spring的JDBC的模版 JDBC模版使用的入门 创建项目,引入jar包 创建数据库和表 使用JDBC的模版 将连接池和模版交给Spring管理 引入Spring的配置文件 使用Jdbc的模版 使用开源的数据库连接池 DBCP的使用 C3P0的使用 抽取配置到属性文件 定义一个属性文件 在Spring的配置文件中引入属性文件 引入属性文件的值 使用JDBC的模板完成CRUD的操作 保存操作 修改操作 删除操作 查询操作 Spring的事务管理 事务的回顾 事务的特性 如果不考虑隔离性引发安全性问题 解决读问题 Spring的事务管理API PlatformTransactionManager:平台事务管理器 TransactionDefinition:事务定义信息

Spring4-Spring中的事务管理&事务隔离级别

痞子三分冷 提交于 2019-11-29 14:51:03
Spring中的事务管理 Spring中的事务管理器 实验代码 MySQL中的表 book表 book_stock表 account表 两个接口 BookShopDao.java public interface BookShopDao { //根据书号获取书的单价 public int findBookPriceByIsbn(String isbn); //更新数的库存. 使书号对应的库存 - 1 public void updateBookStock(String isbn); //更新用户的账户余额: 使 username 的 balance - price public void updateUserAccount(String username, int price); } BookShopService.java public interface BookShopService { public void purchase(String username, String isbn); } 两个接口的实现类 BookShopDaoImpl.java import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @Repository(

Hibernate缓存策略详解

落花浮王杯 提交于 2019-11-29 13:20:59
Hibernate缓存策略 1. 数据缓存 1.1. 概述 缓存是数据库数据临时容器,它包含了库表数据的临时拷贝,位于数据库与数据访问层之间。 ORM 在进行数据读取时,会根据其缓存管理策略,首先在内存中查询,如果在内存中发现所需数据(缓存命中),则直接以此数据错位查询结果加以利用,从而避免了数据库调用的性能开销。 缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。 1.2. 缓存范围 缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三级。 1) 事物级缓存(Transaction Layer Cache ) 缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。 2) 应用级/进程级缓存(Appli cat ion/ProcessLayer Cache) 缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依 赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据

Hibernate4实战 之第五部分:Hibernate的事务和并发

ぐ巨炮叔叔 提交于 2019-11-29 13:19:04
Hibernate本身没有事务的实现 Hibernate 直接使用 JDBC 连接和 JTA 资源,不添加任何附加锁定行为。也就是说你在Hibernate里面使用的事务要么是JDBC的事务,要么是JTA的事务。 Hibernate不锁定内存中的对象 你的应用程序会按照你的数据库事务的隔离级别规定的那样运作,真正对事务的实现和支持也依赖于数据库。 对于并发处理,Hibernate提供了乐观锁和悲观锁来进行并发处理 Hibernate对自动乐观并发控制提供版本管理,针对行级悲观锁定,Hibernate 也提供了辅助的(较小的)API,它使用了 SELECT FOR UPDATE 的 SQL 语法 Hibernate的Session是和事务联系在一起的 可以通过Session去获取事务的接口,从而进行事务的控制。 数据库事务应该尽可能的短 这样能降低数据库中的锁争用。数据库长事务会阻止你的应用程序扩展到高的并发负载。因此,假若在用户思考期间让数据库事务开着,直到整个工作单元完成才关闭这个事务,这绝不是一个好的设计。 这就引出一个问题:一个操作单元,也就是一个事务单元的范围应该是多大? 一个操作一个?一个请求一个?一个应用一个? 反模式:session-per-operation 在单个线程中, 不要因为一次简单的数据库调用,就打开和关闭一次 Session!数据库事务也是如此

ABP理论学习之工作单元(Unit of Work)

痴心易碎 提交于 2019-11-29 12:44:22
返回总目录 本篇目录 公共连接和事务管理方法 ABP中的连接和事务管理 仓储类 应用服务 工作单元 工作单元详解 关闭工作单元 非事务的工作单元 工作单元方法调用其它 工作单元作用域 自动保存 IRepository.GetAll()方法 UnitOfWork特性的限制 选项 方法 事件 公共连接和事务管理方法 在使用了数据库的应用中,连接和事务管理是最重要的概念之一。何时打开一个连接,何时开始一个事务,如何释放连接等等。 你可能已经知道,Net使用了连接池。因此,创建一个连接实际上是从连接池中获取一个连接,因为因为创建一个连接是有消耗的。如果在连接池中没有可用的连接,那么会创建一个新的连接,并将该连接加入连接池。当你释放连接时,实际上是将该连接发送回给连接池,并没有完全释放。这种机制是.Net提供的立即可用的功能。因此,在我们使用完一个连接后应该立即释放,在需要的时候才创建一个新的连接。总之,最佳实践记住这八个字足矣: 尽晚打开,尽早释放 。 这里我推荐一篇关于数据库连接的文章,写得很浅显易懂: 《细说数据库连接》 在一个应用中创建或者释放一个数据库连接,通常有2种方法。 第一种方法 :当Web请求开始(在Global.asax的Application_BeginRequest事件中)的时候创建一个连接,在所有的数据库操作时使用相同的连接,并且在请求结束(Application

ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

血红的双手。 提交于 2019-11-29 12:44:06
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12、ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ABP的官方网站 : http://www.aspnetboilerplate.com ABP在Github上的开源项目 : https://github.com/aspnetboilerplate 通用连接和事务管理方法 连接和事务管理是使用数据库的应用程序最重要的概念之一。当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的。 正如大家都知道的,.Net使用连接池(connection pooling)。因此,创建一个连接实际上是从连接池中取得一个连接,会这么做是因为创建新连接会有成本。如果没有任何连接存在于连接池中,一个新的连接对象会被创建并且添加到连接池中。当你释放连接,它实际上是将这个连接对象送回到连接池。这并不是实际意义上的释放。这个机制是由.Net所提供的。因此,我们应该在使用完之后释放掉连接对象。这就是最佳实践。 在应用程序中,有两个通用的方来创建/释放一个数据库连接: 第一个方法 :在Web请求到达的时候,创建一个连接对象。(Application_BeginRequest这个位于global

Mysql干货

白昼怎懂夜的黑 提交于 2019-11-29 12:23:46
索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据. B+树底层实现是多路平衡查找树 .对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却 无法进行范围查询 . 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序 ,原理同上. hash索引不支持模糊查询 以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测

分布式事务特性,分布式事务处理

不想你离开。 提交于 2019-11-29 11:43:39
1:分布式事物的理解: 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务节点上,分布式事务需要保证这些小操作要么全部成功,要么全部失败;本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 2:分布式失误产生的原因: a)数据库分库分表; 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,简单的说就是原来的一个数据库变成了多个数据库,这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。 b)应用SOA化; 就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心等,对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息,如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。 以上两种情况表象不同,但是本质相同,都是因为要操作的数据库变多了。 3)分布式的使用场景: 支付:一笔支付,是对买家账户进行扣款,同时对卖家账户进行加钱,这些操作必须在一个事务里执行,要么全部成功,要么全部失败,并且卖家账户对应卖家数据库

mysql事务

半城伤御伤魂 提交于 2019-11-29 10:15:33
本篇文章主要从事务的分类,操作,事务隔离级别几个方面进行阐述。 一、概述 事务是数据库系统区别文件系统的一个重要特性。 事务会把数据库从一种状态转为另一种状态。要么都修改,要么都不改。 事务可以是一个简单的sql,也可以是一个复杂的sql,事务是访问并更新数据库中各个数据项的一个程序执行单元 事务的四大特性为ACID,而innodb存储引擎完全符合ACID: 1、原子性(automicity):指整个数据库事务不可分割。要么都执行,要么都不执行。 2、一致性(consistency):指事务将数据库从一种状态转为另一种一致的状态,在事务开始前和结束后,数据库完整约束没有被破坏。 3、隔离性(isolation):(其他称呼:并发控制,可串行化,锁)指各个读写事务对象对其他事务操作相互分离,不可见。 4、持久性(durability):指事务完成后,其结果是永久的,即使机器宕机,也能够恢复。 二、提交方式 1.显式开启和提交。 使用begin或者start transaction来显式开启一个事务,显式开启的事务必须使用commit或者rollback显式提交或回滚。几种特殊的情况除外:行版本隔离级别下的更新冲突和死锁会自动回滚。 在存储过程中开启事务时必须使用start transaction,因为begin会被存储过程解析为begin...end结构块。 2.自动提交。

JDBC控制事务

荒凉一梦 提交于 2019-11-29 08:37:39
一、概述 1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。 2. 操作: 1. 开启事务 2. 提交事务 3. 回滚事务 3. 使用Connection对象来管理事务 * 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 * 在执行sql之前开启事务 * 提交事务:commit() * 当所有sql都执行完提交事务 * 回滚事务:rollback() * 在catch中回滚事务 二、代码 public class JDBCDemo10 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; try { //1.获取连接 conn = JDBCUtils.getConnection(); //开启事务 conn.setAutoCommit(false); //2.定义sql //2.1 张三 - 500 String sql1 = "update account set balance = balance - ? where id = ?"; /