最近工作中大量的使用了Spring、Mybatis、JDBC的事务,这里稍作一下总结。

Spring的Transaction

现在Spring的Annotation就可以完成基本的事务配置,比起以前复杂的xml,确实方便了很多。

网上能搜到很多介绍Spring-Transaction的,主要是讲事务的隔离级别和传播性,这里就不多说了。

提醒大家去看看Spring-Transaction失效的N个原因,避免事务没有完整性的执行。

我们犯的错是同class的非事务方法去调用事务方法,导致事务不起作用。

JDBC事务

mysql有个参数是flush_tx_commit需要关注一下,可能会影响你的事务性能。

事务中的操作肯定是串行的,所以还是尽量想办法让事务精简,能在事务外执行的尽量不要放进来。

比如序列化、反序列化等耗时的操作,尽量提前准备好,再开启事务。单个事务的执行时间越短,

多事务并发的性能才会更理想。在一些情况下,开启事务和逐个提交比起来会快一些,

但不要为了追求这种性能而过分的扩大事务范围。锁的范围变大,大概率会与一些业务上的并发发生冲突,

不利于整体性能的提升。

Mybatis

这次项目中用的是mybatis-plus,在压测的时候关注了一下,性能确实很一般。

但是因为项目本身的业务复杂性,直接使用jdbc确实很不方便。第一个性能问题就是分表plugin,

做表名替换的开销比较大,从sql的参数中提取表名也可能比较慢。第二个性能问题就是通过mybatis

处理数据,会导致比较频繁的ygc。

最后

之前并没有太多关于事务类型业务的开发经验,这次优化能提升两三倍还是很满意的。