Spring如何管理事物的?
1 spring事务在操作过程中 起初会去连接池中获取一个数据库链接
2获取到了链接之后会修改数据库的提交方式为手动提交,我们都知道mysql与oracle的事务隔离级别不同,提交的方式也不同,mysql你执行一条语句它自动帮你commit了,所以要修改为手动提交,
默认的:
begin
select 列1,列2,from 表明
commit:
end
修改之后的:
begin
select 列1,列2,from 表明
select ....多条sql执行但未提交
我们可以看到,在修改之后的代码当中,我们并没有提交commit,所以可以进行回滚操作,
当我们执行逻辑成功之后,程序执行commit操作,
3以上操作配合着spring动态代理对象中实现即可完成。
为什么同样的资源你的经理能写500并发你只能写200个?
首先我们需要了解一下编程式事物与声明试事物有什么区别?
一 声明试事物
声明试事物就只能加在方法上,在方法上增加了声明试事物之后该方法就拥有了事物的 原子性,
方法内部出现错误全部回滚,执行成功则全部提交,但是 该事物性能太差 如果你调用第三方服务处理其他逻辑,当前事物会一直在等待
那么你的数据库链接资源不会被释放掉,别人也不会get到你的数据库链接资源
如果有很多个这样的请求你的数据库连接池资源将全部被消耗掉
二 编程式事物
可以在方法内部中使用,可以把方法内部的代码 按照逻辑分成单元提交,如果你去调用第三方服务处理其他逻辑,可以先把之间的单元提交让数据库链接资源释放掉,这样其他请求就可以迅速get到资源事物,
但是你要考虑的是,该事物的缺点是如果出现错误将需要人手动修补数据,所以每个单元的操作必须记录相应的日志并且整体记录状态,
事物总结:
1两个事物操作的粒度不一样,应用场景不一样,编程式事物可以迅速的处理完成并释放资源,在同样的资源下实现了高可用高并发,效率会比声明试事物快N多倍,