有个方法想使用read_uncommitted,但是一直不起作用,排查了半天终于发现了原因。
结论
情景一:
这种情况下是可以读取到未commit
的数据的。
public class AService{
@Transactional(isolation=Isolation.READ_UNCOMMITTED)
public void fun(){
//这里可以读到脏数据
}
}
情景二:
AService
的一个READ_COMMITTED
方法调用BService
的一个READ_UNCOMMITTED
方法,这个时候是读取不到未commit
的数据的。
public class AService{
@Autowired
private BService bService;
@Transactional(isolation=Isolation.READ_COMMITTED)
public void fun2(){
bService.fun2();
}
}
public class BService{
@Transactional(isolation=Isolation.READ_UNCOMMITTED)
public void fun2(){
//这里不能读取到脏数据
}
}
另外:我用的是jpa hibernate
来保存的数据,在新增完的时候还需要flush
一下,否则上面两种情景都读取不到未提交数据。
下面是我的测试demo:
- 首先新增,并且延迟30s后退出方法提交事务。
- 按照上面两个情景做了两个读取操作。
- *
代码
TestController.java
package com.channelsoft.apiplus.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.channelsoft.apiplus.po.AppDataResponsePo;
import com.channelsoft.apiplus.service.TestService;
@RestController("testController")
@RequestMapping(value = {
"/myTest"})
public class TestController {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private TestService testService;
@ResponseBody
@RequestMapping(value = "/readUnCommitted2")
public JSONObject readUnCommitted2(HttpServletRequest request, HttpServletResponse response) {
logger.info("readUnCommitted2方法...");
AppDataResponsePo result = new AppDataResponsePo();
try{
new Thread(){
@Override
public void run() {
try {
testService.addReadUnCommitted();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread(){
@Override
public void run() {
try {
int i = 0;
while(i++<10){
testService.loadOneReadUnCommitted();
testService.loadOneReadUnCommitted2();
Thread.sleep(5 * 1000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();;
}catch(Exception e){
logger.error("errro:", e);
}
logger.info("readUnCommitted2方法 end.");
return (JSONObject) JSON.toJSON(result);
}
}
TestService.java
package com.channelsoft.apiplus.service;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.co