MyBatis事务隔离级别

news/2024/7/8 2:08:41

一般数据库的隔离级别有4个,由低到高依次为Read uncommittedRead committedRepeatable readSerializable,这四个级别可以逐个解决脏读不可重复读幻读这几类问题。


√: 可能出现    ×: 不会出现



脏读 不可重复读 幻读
说明
Read uncommitted
直译就是”读未提交”,意思就是即使一个更新语句没有提交,但是别 
的事务可以读到这个改变.这是很不安全的。允许任务读取数据库中未提交的数据更改,也称为脏读。
Read committed ×
直译就是”读提交”,可防止脏读,意思就是语句提交以后即执行了COMMIT以后 
别的事务就能读到这个改变. 只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 
Repeatable read × ×
直译就是”可以重复读”,这是说在同一个事务里面先后执行同一个查询语句的时候,得到的结果是一样的.在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
Serializable × × ×
直译就是”序列化”,意思是说这个事务执行的时候不允许别的事务并发执行. 完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

Mybatis也是提供了如上表所示的隔离级别,只不过增加了一种没有事务,源码如下:


 
  1. /*
  2. @author Clinton Begin
  3. */
  4. public enum TransactionIsolationLevel {
  5. NONE(Connection.TRANSACTION_NONE),
  6. READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),
  7. READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),
  8. REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),
  9. SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);
  10. private final int level;
  11. private TransactionIsolationLevel(int level) {
  12. this.level = level;
  13. }
  14. public int getLevel() {
  15. return level;
  16. }
  17. }

这样在DefaultSqlSessionFactory中创建SqlSession时,可以设置数据库的事务隔离级别,以及通过设置autoCommit来设置事务的提交方式,方式如下:

当autoCommit=false时,插入的数据报错时,修改的内容不会提交到数据库,但是如果没有进行rollback回滚操作时就会造成数据库死锁问题

 当autoCommit = true对连续的操作数据中间出现错误时会部分提交,导致产生脏数据。

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)
 

Mybatis提供的事务隔离级别完全契合数据库事务隔离级别方式。


http://www.niftyadmin.cn/n/2776854.html

相关文章

java json和map相互转化

2019独角兽企业重金招聘Python工程师标准>>> java使用json要导入如下这些包: commons-beanutils-1.7.0.jar commons-lang-2.1.jar ezmorph-1.0.2.jar json-lib-1.1-jdk15.jar commons-logging-1.0.4.jar commons-collections.jar commons-collections…

获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用

当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直到每个future都已完成。如果我们不希…

java timertask 定时_java任务调度之Timer定时器

定时器相信大家都不陌生,平时使用定时器就像使用闹钟一样,我们可以在固定的时间做某件事,也可以在固定的时间段重复做某件事,今天就来分析一下java中自带的定时任务器Timer。一、Timer基本使用在Java中为我们提供了Timer来实现定时…

Spring源码分析之一:spring容器启动以及获取Bean实例所做的事

一般手动启动spring容器和获取Bean实例我们会写如下代码: BeanFactory bf new XmlBeanFactory(new ClassPathResource("testBean.xml",getClass())); MyTestBean bean (MyTestBean) bf.getBean("myTestBean"); 或者是 ApplicationContext…

java web 加载dll_JavaWeb项目中dll文件动态加载方法解析(详细步骤)

相信很多做Java的朋友都有过用Java调用JNI实现调用C或C方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢。今天就给大家带来一篇JAVA Web项目中DLL/SO文件动态加载方法的文章。在Java Web项目中,我们经常会用到通过JNI调用dll动态库文件来…

java hashtable 删除_如何在Java中删除HashTable中的节点?

我是个编程新手。我目前正在学习Java编程语言。我的问题是,我试图删除一个包含HashTable中某个值的特定节点,但是我不知道我哪里出错了。有人能解释一下如何删除这个特定的节点吗?提前谢谢你。对不起,我的英语不好。“艾伯特”和应该删除。这是我的代码:班级:public class Has…

hadoop java api下载文件_使用java api操作Hadoop文件

1. 概述2. 文件操作2.1 上传本地文件到hadoop fs2.2 在hadoop fs中新建文件&#xff0c;并写入2.3 删除hadoop fs上的文件2.4 读取文件3. 目录操作3.1 在hadoop fs上创建目录3.2 删除目录3.3 读取某个目录下的所有文件4. 参考资料接代码下载<1>. 概述hadoop中关于文件操…

极简在线安装Redis

安装 下载&#xff0c;解压缩和编译Redis&#xff1a; $ wget http://download.redis.io/releases/redis-4.0.11.tar.gz $ tar xzf redis-4.0.11.tar.gz $ cd redis-4.0.11 $ make 这期间如果提示要下gcc编译器或者wget工具什么的&#xff0c;按照提示自行百度下载对应的软件…