一.背景知识
1.Sharding jdbc
当当提供的轻量级java框架,通过客户端进行分库分表策略执行等操作,直连到数据库
http://shardingsphere.io/document/current/cn/overview/
2.Spring
项目给于spring提供的事务管理和springBoot带来的快速启动
3.Mybatis和Mybatis-Spring
使用mybatis来执行ORM的相关操作,大大减少了单纯使用jdbc带来的大量映射的工作量
http://www.mybatis.org/mybatis-3/zh/index.html
http://www.mybatis.org/spring/zh/
二.通过代码来学习
1.前置代码准备
首先来看一段我们日常经常会写的代码
Controller:
@RequestMapping
public String insertUser(){
User user = new User();
user.setName("hello test spring transactional");
user.setUserId(0L);
userService.save(user);
return "success";
}
Service:
@Override
@Transactional
public User save(User domain) {
return dao.insertSelective(domain);
}
Dao:
public User insertSelective(User user){
myBatisMapper.insertSelective(user);
return user;
}
这是三个非常常见的一个MVC模式下的简单insert操作代码,现在就由这个开始我们探索Sharding、Spring和Mybatis整个执行流程的原理
2.执行流程
2.1Spring的DataSourceTransactionManager
众所周知,我们可以使用注解@Transactional非常简便的为DML操作加上事务的管理,我们的第一步也是从DataSourceTransactionManager这里开始讲起,先看看这个类的几个关键方法(篇幅问题只截取里面较为关键的代码):
(1)doBegin:
DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
Connection con = null;
if (!txObject.hasConnectionHolder() ||
txObject.getConnectionHolder().isSynchronizedWithTransaction()) {
Connection newCon = obtainDataSource().getConnection();
if (logger.isDebugEnabled()) {
logger.debug("Acquired Connection [" + newCon + "] for JDBC transaction");
}
txObject.setConnectionHolder(new ConnectionHolder(newCon), true);
}
txObject.getConnectionHolder().setSynchronizedWithTransaction(true);
con = txObject.getConnectionHolder().getConnection();
Int