MyBits数据库框架事物的使用心得
2018-01-04 本文已影响109人
吃猫的鱼0
事务的四个特性:
- 原子性:事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。
- 一致性:事物发生前后数据的状态必须一致。
- 隔离性:多个事物同时处理事物时,事物间的操作是互相隔离的。
- 持久性:对于任意已提交事务,对数据库中的数据的改变就是永久性的。
Mybits事物处理
当对数据库进行多表操作的时候就很容易出现不同步的现象,这时候就需要采用事物对数据库进行操作了。
利用了mybits怎么对数据进行操作呢?
刚开始的时候以为,只要在方法上添加了 @Transactional 就可以简单的处理事物了
但是在使用中发现出现了问题,当没有异常的时候 事物不回滚,
后开看mybits的api发现了另一种操作事物的方法
SqlSession sqlSession = sqlSessionFactory.openSession();//开启事物
SetUpMapper setUpMapper = sqlSession.getMapper(SetUpMapper.class); //将dao交给事物管理
ShoppingCartsMapper shoppingCartsMapper = sqlSession.getMapper(ShoppingCartsMapper.class); //将dao交给事物管理
try {
We(setUpMapper);//数据库操作
Integer num=setUpMapper.saveApkVersion(apkVersion);//数据库操作
sqlSession.rollback();
//int i = 2 / 0; // 触发运行时异常
} catch (Exception e) {
}finally{
sqlSession.close(); //关闭清理资源
}
然后再这种操作下发现这个sqlSession不能回滚(回滚后数据还是存到数据库),
而且当sqlSession.commit()后如果后面出现异常这个操作反而回滚了。
而且不用上面操作只有当出现异常后不做任何操作都会出现回滚的现象,(也就是说只要出现异常就会出现回滚)
为什么呢?为什么会出现这种情况呢?
这时候突然想到,在配置spring的时候讲事物交给spring来管理,也就是说,事物是由spring来管的和mybits现在没关系了,
而spring是用什么来管的呢?/** @Transactional(rollbackFor = Exception.class)
就是利用捕捉的异常来管理的,如果出现异常就在这个地方回滚
所以这时候就要注意
注:不可catch Exception或RuntimeException而不抛出:
而上面的那个回滚呢是没有和spring集成的时候利用mybits来操作的不能说有错只用在是不同的地方
嵌套事务
- 1、内外都无try Catch的时候,外部异常,全部回滚。
- 2、内外都无try Catch的时候,内部异常,全部回滚。
- 3、外部有try Catch时候,内部异常,全部回滚
- 4、内部有try Catch,外部异常,全部回滚
- 5、友情提示:外层方法中调取其他接口,或者另外开启线程的操作,一定放到最后!!!(因为调取接口不能回滚,一定要最后来处理)