java的局部事务场景中,系统里事务管理的具体处理方式会随着所使用的数据访问技术的不同而异。java平台不使用专用的api来管理事务,而是通过当前使用的数据访问技术所提供的基于connection的api来管理事务。
jdbc:讲数据库连接的自动提交功能设置为false,改为手动提交来控制整个事务的提交或者回滚。hibernate是通过hibernate的session来控制。
java平台的分布式事务支持主要通过JTA或者JCA提供支持。分布式不懂,先不说
反思:
1、局部事务的管理绑定到了具体的数据访问方式。
这样导致的问题就是事务管理代码和数据访问代码甚至业务逻辑代码相互混杂,因为我们使用的是数据访问的api进行事务控制。实际使用中,不能通过合适的方式将事务管理和数据访问代码甚至业务代码进行逻辑上的隔离,将直接导致数据访问代码和业务逻辑代码的可重用性降低,甚至事务管理代码在数据访问层和业务服务层的到处散落。一句话,数据访问和事务管理过紧耦合。
2、事务的异常处理。
事务处理过程中的异常应该都是不可恢复的,所以应该抛出unchecked异常,并且有一个统一的父类,便于客户端处理。但是现在的情况是:没有统一的事务相关异常体系。许多事务管理代码在使用过程中还是抛出checked exception,这强制客户端来捕获和处理它。
3、事务处理api的多样性。
没有统一的方式管理,使事务管理变得繁杂。
4、CMT声明式事务的局限。
网友评论