现在的位置: 首页 > 综合 > 正文

Java事务杂记

2012年10月03日 ⁄ 综合 ⁄ 共 1912字 ⁄ 字号 评论关闭
关于ibatis, 连接池,事务的总结:
1. ibatis和proxool配合。session.close()并不真正调用connection.close(). 而proxool采用委托动态代理的方式替换了connection.close()实现,必须调用connection.close()方可回收链接,而非真正物理断开。 所以我们使用了proxool连接池后,每次使用完session, 都要session.getConnection.close();
2. ibatis 3 + spring的事务并没有内部支持,所以无法在spring+ibatis 3默认采用生命式事务,需要额外写个针对ibatis 3声明式事务的TransactionManager实现.上次发给chris的有类似实现.
3. mysql innodb引擎方可支持事务和级联引用完整性;
4. jdbc 3方可支持savePoints()分阶段回滚. e.g.: 
Savepoint sp1 = connection.setSavepoint("savePoint 1");
...
connection.rollback(sp1);
java.sql.Savepoint 必须存在, 即 jdk 版本要 1.4+;
MySQL InnoDB引擎从MySQL 5.0.3开始支持SAVEPOINT(详见: http://dev.mysql.com/doc/refman/5.0/en/savepoint.html);
5. spring托管的事务可支持: 同一连接的数据库事务,跨分布式数据库的JTX分布式事务;
6. spring声明式事务的事务级别浅显含义:
PROPAGATION_REQUIRED: 传承当前上下文事务,若当前上下文没有事务,则创建一个新事务;这是最常见的选择。
PROPAGATION_SUPPORTS: 支持当前上下文事务,若当前上下文没有事务,则以非事务方式执行;也即事务可选;
PROPAGATION_MANDATORY: 当前上下文必须存在事务;若当前上下文没有事务,则抛出异常;
PROPAGATION_REQUIRES_NEW:忽略当前上下文事务,总是创建新事务,挂起上下文事务直到新事务结束; 也即外部事务成败不影响当前事务结果;
PROPAGATION_NOT_SUPPORTED: 忽悠当前上下文事务,以非事务方式;
PROPAGATION_NEVER: 不允许在事务上下文中执行,若当前上下文存在事务,则抛出异常;
PROPAGATION_NESTED: 内嵌事务(EJB中没有对等概念), 只在某些transactionManager中支持.只在JDBC 3.0+的DataSourceTransactionManager中支持;
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
前六个策略类似于EJB CMT,第七个(PROPAGATION_NESTED)是Spring所提供的一个特殊变量。 
它要求事务管理器或者使用JDBC 3.0 Savepoint API提供嵌套事务行为(如Spring的DataSourceTransactionManager) 
7. ibatis 3的事务操作注意事项:
1). 开启session方式: SqlSession session = sessionFactory.openSession(TransactionIsolationLevel.READ_COMMITTED);
2). 设置非自动commit(否则每条语句都被当作一个事务): session.getConnection().setAutoCommit(false);
3). 提交注意事项: session.getConnection().commit(); 采用session.commit()无效,很诡异; 估计session.rollback()也无效;
4). 如果部分语句需要采用批量操作(e.g.: addBatch): 则可用同一connection来创建一个新的session:
SqlSession session1 = sessionFactory.openSession(ExecutorType.BATCH, session.getConnection() );
不过有个诡异事情: 测试发现JDBC批量操作的效率反而不如直接插入;网上也有其他人同样反馈;
8. 综合来看,若能采用spring的生命式事务,是最好的选择。最灵活,可透明支持 本地(同一数据库连接) 和 分布式事务(通过JTX分布式事务实现);
参考: 
http://www.javaeye.com/topic/35907

抱歉!评论已关闭.