0000ps
2008-01-29 18:12

我也做了个类似的例子, 只用jdbc 和 spring , 没有用hibernate和任何应用服务器....

结果也是控制不了transaction, 不过从log4j的输出看,

的确该rollback的exception是有rollback, 该commit的exception也是有commit. 貌似spring rollback和commit的connection 和我用来做DB操作的connection是两个实例 .... ()

[org.springframework.transaction.interceptor.TransactionInterceptor] - Completing transaction for <b>[dream.service.JdbcService.insertTTRange] after exception: dream.exception.ToRollbackException

[org.springframework.transaction.interceptor.RuleBasedTransactionAttribute] - Applying rules to determine whether transaction should rollback on dream.exception.ToRollbackException

[org.springframework.transaction.interceptor.RuleBasedTransactionAttribute] - Winning rollback rule is: RollbackRuleAttribute with pattern [ToRollbackException]

[org.springframework.jdbc.datasource.DataSourceTransactionManager] - Triggering beforeCompletion synchronization

[org.springframework.jdbc.datasource.DataSourceTransactionManager] - Initiating transaction rollback

[org.springframework.jdbc.datasource.DataSourceTransactionManager] - Rolling back JDBC transaction on Connection </b>[jdbc:microsoft:sqlserver://AspenServer:1433;NETADDRESS=000000000000;HOSTPROCESS=0;SENDSTRINGPARAMETERSASUNICODE=true;LOGINTIMEOUT=0;DATABASENAME=Test;PROGRAMNAME=;SELECTMETHOD=direct;WSID=, UserName=sa, SQLServer]

[org.springframework.jdbc.datasource.DataSourceTransactionManager] - Triggering afterCompletion synchronization

[org.springframework.transaction.support.TransactionSynchronizationManager] - Clearing transaction synchronization

[org.springframework.transaction.support.TransactionSynchronizationManager] - Removed value [org.springframework.jdbc.datasource.ConnectionHolder@1dacccc] for key [org.apache.commons.dbcp.BasicDataSource@e41bc3] from thread [main]

[org.springframework.jdbc.datasource.DataSourceTransactionManager] - Releasing JDBC Connection [jdbc:microsoft:sqlserver://AspenServer:1433;NETADDRESS=000000000000;HOSTPROCESS=0;SENDSTRINGPARAMETERSASUNICODE=true;LOGINTIMEOUT=0;DATABASENAME=Test;PROGRAMNAME=;SELECTMETHOD=direct;WSID=, UserName=sa, SQLServer] after transaction

[org.springframework.jdbc.datasource.DataSourceUtils] - Returning JDBC Connection to DataSource

[该贴被0000ps于2008-01-29 18:13修改过]

banq
2008-01-30 16:57

Spring引入显式事务表面上给使用者带来可配置方便,太实际上引入了复杂性,Spring+Hibernate必须强制配置事务,否则无法运行,这些从一个侧面看事务和线程一样不是那么好驾驭的,这也是EJB将事务封装到容器一个原因之一,Spring打破这个盒子,曾经被一些盲目跟从者叫好,同时他们必须面对潘多拉盒子打开的后果。

现在Grails又试图将Spring+Hibernate及其它打开的潘多拉盒子冒出的魔鬼一起再封装到一个新的盒子里..

唉,,分久必和 合久必分。螺旋式上升?

[该贴被banq于2008-01-30 17:14修改过]

0000ps
2008-01-31 15:34

sorry, 我收回我说的..

spring在纯jdbc也可以控制事务,

不过dataSource要以注入的方式获取..

不然spring最后commit 或rollback的connection, 和数据操作的connection是不同的object, 这样就会造成spring没有在控制transaction的假象

water1735
2010-02-26 22:44

public static void main(String[] args) { FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("beans.xml"); AccountService service = (AccountService) context.getBean("accountservice"); Account a = new Account(); a.setId("U001"); a.setName("zc"); a.setPhone("123"); AccountProfile ap = new AccountProfile(); ap.setName(a.getName()); // "zc" ap.setPassword("abcdef"); service.registerAccount(a,ap); a = new Account(); a.setId("U002"); a.setName("zc"); a.setPhone("123"); ap = new AccountProfile(); ap.setName(a.getName()); // "zc" ap.setPassword("12345"); service.registerAccount(a,ap); context.close(); }

water1735
2010-02-26 22:52

楼主说的是两个事务,service.registerAccount(a,ap)执行了两次.这里是两个分开的事务.第一次执行当然没问题,事务成功.第二次会因为因为主键冲突出错,当然你不能期望第一次的数据能回滚.

如果你这样测试就能满足你的要求了:

public void registerAccount(Account a,AccountProfile ap){

accountDao.insert(a);

accountProfileDao.insert(ap);

accountDao.insert(a);

accountProfileDao.insert(ap);

}

那么一条数据都不会插入成功.

2Go 上一页 1 2