一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情
前言
-
数据库事物对于我们来说简直太友好了。没有他脏数据可能搞垮整个系统。数据库层面上的事物今天我们就不多说了。下面我们谈谈在m y ba ti s中是如何管理事务的。
-
JdbcTransaction:使用JDBC的事务管理机制,利用java.sql.Connection对象完成事务的提交。
-
ManagedTransaction:使用Managed的事务管理机制,mybatis自身不会去实现事务管理,而是让容器(JBOSS、WebLogic)实现对事务的管理。
-
SpringManagedTransaction:使用spring的事务管理机制,利用@Transaction注解即可实现
流程
-
TransactionSynchronization接口是Spring的事务扩展接口,是一个回调接口,用于在事务执行过程中的重要时间点执行额外的逻辑,
-
TransactionSynchronizationManager类:使用ThreadLocal管理当前事务的TransactionSynchronization集合
-
从SqlSessionTemplate类创建JDK动态代理类开始,因为无论那种执行sql的方式,最终都会走此代码。
-
进入getSqlSession方法 如果没有sqlsession,则通过sessionFacory创建sqlsession,然后执行registerSessionHolder注册sessionHolder。
从事务同步管理器中拿资源(sqlSessionHolder只把是Sqlsession包装了一层),从sessionHolder中拿sqlsesison。
- 进入TransactionSynchronizationUtils方法进行回调一开始保存在synchronizations属性中的TransactionSynchronization实现类
比如mybaits一开始定义的SqlSessionSynchronization类
总结
- 在m y ba ti s中为了应对我们的复杂的需求,mybatis为我们提供了事物的传播属性的控制。一共有7类来完成我们各个方法之间事物的管理统一,从而不会因为我们将业务抽离导致带来的事物失效或者错乱的情况
- 上面提到了mybatis中封装的session. 在mybatis中中我们也可以将自动提交取消。这样我们手动来控制回滚。这样我们手动管理事物,也是可以有效避免掉方法调用带来的事物问题。总之事物将我们存储的数据作出一层隔离层来。这样方便我们任何时候对数据会退。