------------------本文为笔者学习Spring时做的摘记-----------------
- JDBC事务 是由connection对象控制的, Connection提供了两种提交方式,手动和自动,也就是是否需要显示地调用commit方法。自动模式下,一个SQL语句就是一个事务。JDBC定义了SavePoint接口,提供一个更细的事务控制。当设置一个保存点后,rollback到该保存点处的状态,而不是整个事务。使用JDBC的事务管理只局限在一个数据库连接中。
- JTA 是于实现无关的API,它允许程序分布式处理。如果用JTA,那么需要实现javax.sql.XADataSource、javax.sql.XAConnection和javax.sql.XAResource接口的JDC驱动程序。一个XADataSource对象就是一个XAConnection对象的工厂,XAConntection是参与JTA事务的JDBC连接。XA连接和非XA连接的区别在于是否支持JTA,支持JTA意味着XA连接不能自动提交必须手动提交,而手动提交的方式必须是事务级别的commit,而不是JDBC中连接(connection)的commit。
- 容器事务 是应用服务器提供的。可以指定哪些方法加入事务,一旦指定,容器负责管理事务任务,主要是在EJB应用中。
EJB必须借助JTA实现。而Spring不是,如果只用单一的资源,那么就可以使用持久机制提供的事务支持来处理,这包括jdbc,hibernate等。如果程序中有设计到多个资源的事务需求,Spring可以用第三方的JTA实现来提供一个分布式的事务支持。
也就是说,Spring并没有直接管理事务,而是它提供一种选择,把事务管理部分的责任委托给平台具体的事务实现,这些事务实现可能是JTA提供的,也可以使持久机制提供的。
Spring配置文件中关于事务的配置,由三部分组成:DataSource、TransactionManager和代理机制,无论那种配置方式,一般变化的只是代理机制这个部分。而DataSource,TransactionManager这两个部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。