Spring事务隔离级别简介及实例解析
本文研究的主要是Spring事务隔离级别(solation level)介绍及例子,具体如下。 当两个事务对同一个数据库的记录进行操作时,那么,他们之间的影响是怎么样的呢?这就出现了事务隔离级别的概念。数据库的隔离性与并发控制有很大关系。数据库的隔离级别是数据库的事务特性ACID的一部分。ACID,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。Spring的事务隔离级别有四个: 下面来具体看看。 READ_UNCOMMITTED顾名思义, READ_COMMITTED
在事务A两次读取的过程之间,事务B修改了那条记录并进行提交。因此,事务A前后两次读取的记录不一致。这个问题称为non-repeatable read(不可重复读)。(两次读取的记录不一致,重复读取就会发现问题。) 除了non-repeatable read的问题, REPEATABLE_READREPEATABLE_READ意思是,一个事务可以多次从数据库读取某条记录,而且多次读取的那条记录都是一致的,相同的。这个隔离级别可以避免dirty read和non-repeatable read的问题,但可能发生phantom read的问题。如下图。 事务A两次从数据库读取一系列记录,期间,事务B插入了某条记录并提交。事务A第二次读取时,会读取到事务B刚刚插入的那条记录。在事务期间,事务A两次读取的一系列记录不一致,这个问题称为phantom read。 SERIALIZABLESERIALIZABLE是Spring最强的隔离级别。事务执行时,会在所有级别上加锁,比如read和write时都会加锁,仿佛事务是以串行的方式进行的,而不是一起发生的。这会防止dirty read、non-repeatable read和phantom read的出现,但是,会带来性能的下降。 DEFAULTMySQL默认是 例子下面,我们看一个例子。在数据库mysql里开启一个事务,不提交。然后,另一个事务读取记录。 刚开始,数据库里的记录,如图 接下来,在数据库mysql中开启事务A,并插入一条记录。 在service的业务类的事务属性配置为 @Transactional(isolation=Isolation.READ_UNCOMMITTED) public class AccountService { private AccountDAO accountDAO; public AccountDAO getAccountDAO() { return accountDAO; } public void setAccountDAO(AccountDAO accountDAO) { this.accountDAO = accountDAO; } public void transfer(String from,String to,double money) { accountDAO.outMoney(from,money); accountDAO.inMoney(to,money); } public void readAllUser() { List<Account> accounts = accountDAO.getAllUser(); for (Account account : accounts) { System.out.println(account); } } } 运行下面的测试类 package com.chris.service; import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class ReadAllUserTest { @Autowired private AccountService accountService; @Test public void test() { accountService.readAllUser(); } } 结果如下: 可见,这个事务读取到了未提交的数据。 这时候,将mysql中开启的事务A回滚。 mysql> rollback; 再次运行程序,结果为
总结以上就是本文关于Spring事务隔离级别简介及实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持! 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |