03MyBatis的事务管理和缓存机制
MyBatis的事务管理
- 事务的概念:事务是一个或几个操作组成的一个整体执行单元,它们要么全部执行,要么全不执行,不能只执行其中的某几个操作;可以理解为一个事务是一个程序中执行的最小单元。
- 事务的特性:事务包含四个特性:原子性、一致性、隔离性、持久性,简称ACID性,具体详解如下
- 原子性:事务是应用中最小的执行单位,就像自然界中原子是最小的颗粒一样,具有不可分隔的特性,事务是应用程序中不可分隔的最小逻辑执行单元。
- 一致性:事务执行的结果,必须使数据库从一种一致状态,变成另为一种一致状态。例如事务中包含两条需要执行的sql语句,要么两条语句都执行成功,要么都不成功,这就是一致性。
- 隔离性:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。即,并发执行的事务之间是不会互相干扰的。
- 持续性:指事务一旦提交,对数据的修改就是永久的,不可逆的。
- 事务的执行动作:数据库的事务执行动作可分为:创建(create)、提交(commit)、回滚(rollback)、关闭(close),其对应的动作都抽象到了Transaction接口中,其源代码如下:
public interface Transaction {
//获取数据库连接
java.sql.Connection getConnection() throws java.sql.SQLException;
//提交
void commit() throws java.sql.SQLException; //回滚 void rollback() throws java.sql.SQLException; //关闭数据库连接 void close() throws java.sql.SQLException;
}
4.MyBatis的事务管理分类:
- 使用JDBC的事务管理机制 —— 利用java.sql.Connnection对象完成对事务的提交、回滚和关闭等操作。
- 使用MANAGED的事务管理机制 —— 对于这种机制,MyBatis自身不会去实现事务管理,而是让容器如JBOSS等来实现对事务的管理。
5.事务的使用流程。
首先在MyBatis的根配置文件mybatis-config.xml中定义如下信息:
<environment id="mysql"><!--指定事务管理类型,type="JDBC"指直接使用JDBC的提交和回滚设置,type=“MANAGED”指让容器实现对事务的管理--> <transactionManager type="JDBC" /><!-- <transactionManager type="MANAGED"><property name="closeConnection" value="false" /></transactionManager>--><!-- dataSource数据源配置,POOLED是JDBC连接对象的数据源连接池的实现。--><dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /><property name="username" value="root"/> <property name="password" value="123456" /> </dataSource>
</environment>
事务工厂的创建:MyBatis的事务创建是由org.apache.ibatis.transaction.TransactionFactory事务工厂来完成的,会根据的type类型来创建是JdbcTransactionFactory工厂还是ManagedTransactionFactory工厂,其源码如下:
public interface TransactionFactory {void setProperties(java.util.Properties properties);
org.apache.ibatis.transaction.Transaction newTransaction(java.sql.Connection connection);
org.apache.ibatis.transaction.Transaction newTransaction(javax.sql.DataSource dataSource, org.apache.ibatis.session.TransactionIsolationLevel transactionIsolationLevel, boolean b);
}
事务工厂TransactionFactory:通过TransactionFactory可以获得到Transaction对象的实例,以JdbcTransaction为例,其源码如下:
ublic class JdbcTransactionFactory implements TransactionFactory {public void setProperties(Properties props) {}//根据给定的数据库连接Connection创建Transactionpublic Transaction newTransaction(Connection conn) {return new JdbcTransaction(conn);}//根据DataSource、隔离级别和是否自动提交创建Transactionpublic Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {return new JdbcTransaction(ds, level, autoCommit);}
}
二、MyBatis的缓存机制
1.一级缓存(SqlSession级别) ——
含义:在操作数据库时需要创建SqlSession对象,在对象中有一个HashMap用来存储缓存数据,并且不同的SqlSession之间的缓存数据区域是不会互相影响的。
1.2 作用域:一级缓存的作用域是SqlSession范围,就是当同一个SqlSession中执行两次相同的sql查询语句时,第一次回去数据库中查询数据并写到缓存中,第二次在查询的时候,不会再去数据库中去查询,而是直接在缓存中读取数据。在使用时需要注意:当SqlSession执行DML操作(insert、update、delete)时,MyBatis会清空SqlSession中的一级缓存,这样做的目的是保证缓存中的数据永远是最新的数据,防止出现脏读数据。
2.二级缓存(mapper级别) ——
1.1 含义:使用二级缓存时,多个SqlSession共享一个Mapper的sql语句去操作数据库,得到的数据,同样用HashMap来存储缓存数据,相比较于一级缓存,二级缓存的范围更大,多个SqlSession共享二级缓存,二级缓存时跨SqlSession的
1.2. 作用域:二级缓存的作用域是mapper的同一个namespace,当不同的SqlSession执行相同的namespace下的sql语句,并向sql语句中传递的参数也相同时,第一次回去数据库中查询数据并写到缓存中,第二次在查询的时候,不会再去数据库中去查询,而是直接在缓存中读取数据。
1.3 二级缓存的使用配置:因为MyBatis默认没有开启二级缓存,需要在setting全局参数中开启二级缓存,其mybatis-config.xml配置文件如下:
<settings> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"/></settings>
在需要开启二级缓存的mapper文件中加入如下配置:
<cache eviction="LRU" flushInterval="10000" size="512" readOnly="true" />
其上述元素配置详解如下:
- eviction —— 收回策略,默认为LRU,一共有如下几种回收策略
- LRU —— 最近最少使用的策略,移除最长时间不被使用的对象。
- FIFO —— 先进先出策略,按对象进入缓存的顺序来移除它们。
- SOFT —— 软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
- WEAK —— 弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对
- flushInterval —— 刷新间隔,可以被设置为任意的正整数,它的单位毫秒,默认情况下是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新。
- size —— 缓存数目,可以被设置为任意正整数,要记住你缓存的对象数目和你运行环境的可用内存资源数目。默认值是1024。
- eadOnly —— 只读属性,可以被设置为 true或false,只读的缓存会给所有调用着返回缓存对象的相同实例,因此这些对象不能被修改,可读写的缓存会返回缓存对象的拷贝(通过序列化)。这样做会慢一些,但是安全,因此默认是false。
03MyBatis的事务管理和缓存机制相关推荐
- XPO:Session管理与缓存--机制篇
缓存的意义已经无需多言了.这里整理了一篇DevExpress的关于XPO的Session管理和缓存的文章:Session Management and Caching. About Sessions ...
- MySQL基础篇(06):事务管理,锁机制案例详解
本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MyS ...
- XPO:Session管理与缓存--测试篇
之前整理了一下XPO在Session管理和缓存方面的一些资料(XPO:Session管理与缓存--机制篇),但原文的例程还是有些含糊的地方,这两天抽空做了一下测试.若有不当或者不对的地方敬请不吝赐教. ...
- Spring入门5.事务管理机制
Spring入门5.事务管理机制 20131126 代码下载 : 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分 ...
- Spring 框架基础(05):事务管理机制,和实现方式
本文源码:GitHub·点这里 || GitEE·点这里 一.Spring事务管理 1.基础描述 Spring事务管理的本质就是封装了数据库对事务支持的操作,使用JDBC的事务管理机制,就是利用jav ...
- Hibernate框架(持久化类、缓存、事务管理)
持久化类 java类与数据库的表建立了映射关系,该类被称为持久化类 1).编写规则 ①无参构造,使得Hibernate可通过反射建立对象 ②私有属性,get/set方法 ③持久化类提供一个唯一标识OI ...
- spring配置mysql事务管理_Spring 数据库事务管理机制
要点1 Spring事务管理方法编程式事务(TransactionTemplate.PlatformTransactionManager) 声明式事务(配置式.注解式) 2 Spring 注解 @Tr ...
- 基于Spring中的事务管理机制
什么是事务? 通俗理解,事务其实就是一系列指令的集合. 为什么要使用事务管理? 我们在实际业务场景中,经常会遇到数据频繁修改读取的问题.在同一时刻,不同的业务逻辑对同一个表数据进行修改,这种冲突很可能 ...
- 【Spring学习笔记 九】Spring声明式事务管理实现机制
什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...
最新文章
- 6001.Cacti监控华为S8512核心交换机多块板卡的CPU和内存
- hdu4665 DFS
- CrazyWing:Python自动化运维开发实战 九、Python数据类型之列表
- Spring MVC handler interceptors example--转载
- Vue-cli3.0Mock数据使用
- ubuntuKylin17.04重装KDE
- Hive谓词解析过程分析
- 航空机票预订c#代码_航空公司座位预订问题的C ++程序
- IDEA远程部署调试Java应用程序
- ***git自动化部署总结
- ubuntu 15.10 升级 到Ubuntu 16.04.3 LTS
- 算法:间隔重排序链表Reorder List
- 汽车VIN码超详细解析规则
- matlab 图像处理之拟合圆
- Python 汇率换算
- 机器学习Sklearn Day1
- 用PhotoShop如何改变一张图片的方向
- 测试服务器UDP/TCP丢包率
- linux网络之怪现象一--接网线启动网络不通,不接网线启动再插线网络通
- python 如何换行
热门文章
- CenterOS防火墙操作
- 2017.5.16AM
- Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
- EDM邮件营销之如何制作模板
- JavaScript学习笔记之DOM篇,带你全面了解什么是DOM
- JNI开发笔记(六)--一种更规范的so库生成方法
- java启动servlet_Java Servlet 运行原理分析
- 7-13 镖局运镖 (10 分)
- python获取文件夹里有什么文件+查看特定格式的文件
- android自动化工程师,自动化工程师应具备哪些技能