事务-orm框架

143 阅读3分钟

背景

orm框架,主要是hibernate和mybatis。

底层实现

orm框架的事务,只是封装了jdbc API而已,本身跟事务没什么关系,事务功能是基于底层的jdbc API去实现,其实是各个数据库厂商提供的jdbc客户端去实现,因为jdbc只是一堆接口API规范,具体的实现都是各个数据库厂商。


mybatis和hibernate一样,事务都是基于jdbc API里的连接connection 来提交事务的。本身并没有事务功能。


最底层都是数据库服务器,因为数据库客户端调用的也是数据库服务器。

最佳实践

由上层的spring容器来控制事务,而不是底层的orm框架、连接池框架、jdbc api连接connection对象本身。

orm框架的事务是基于底层的jdbc API连接connection 去实现去提交事务,但是实际工作中,都是委托给了spring容器去管理,比如用spring的事务注解。虽然委托给了spring容器,具体来说是spring的事务管理器,但是底层仍然是调用jdbc API连接connection的提交方法,只不过orm框架和service框架会一层一层的封装,让应更好更方便的使用数据库事务功能。

自动提交

如果设置为事务自动提交,那么每个SQL执行完成都会提交一次事务。事务自动提交可以配置是否开启,最佳实践是关闭。

在哪里关闭?每一层都可以关闭,因为上层的spring事务、orm框架、连接池框架,都是对底层jdbc api 连接connection的封装,上层的关闭就是对底层的关闭,是一回事。

Orm框架最大的作用

1.查询的时候,不用写SQL,其实xml配置文件还是SQL
2.查询完了之后,不用处理结果集对象,直接得到一个list集合,使得读写数据库的数据更方面

一个事务的多个SQL,共用同一个连接对象

一个事务的多个SQL,是共用同一个连接的,最后关闭的时候,顺序是
1.结果集resultset
2.statement
3.connection

生命周期

事务的底层都是jdbc API客户端,包括两个方面
1.事务由连接connection 来提交
2.事务的生命周期就是连接connection 的生命周期

连接池

连接池是新版jdbc出的功能,其实就是为了提高连接对象的复用,从而提高访问数据库速度,具体来说,就是获取数据库连接的速度。

orm框架的锁,也是基于数据库的锁实现,本身跟锁没有什么关系,其实本质是基于SQL的锁,比如查询SQL for update,给满足查询条件的数据加锁。


公司系统(hibernate)很多地方用了锁,而且不等待,即如果获取不到锁,锁如果被别人占用,那么就立即失败,即抛出异常:获取不到锁。应用场景都是会重做的场景,即这次失败了,下次轮询的时候重做,所以这次失败了对最终结果没有影响,比如查询支付结果是多次查询。

如果阻塞等待,应用场景都是非重做的场景,比如,支付的时候,只支付一次。

参考

mybatis技术内幕


夏昕 深入浅出hibernate