spring事务的实现原理,不搞明白,很不爽。
刚学spring,在spring的事务编程中有一些事务的原理问题不明白?
1,一般在单一数据库中,如果手动方式写事务的话,我对事务的理解就是
(1)首先在数据库连接中
con.setAutocommit(false)设置手动提交事务
(2)然后执行sql语句,最后提交。
stmt = con.createStatement();
stmt.executeUpdate("UPDATE user SET age = 18 WHERE id = 'erica'");
con.commit()
2,可是在spring的声明式的事务编程中,我有点不明白,举以下一个例子,但这个例子中,我没法体现上面的事务步骤?首先设置con.setAutocommit(false),然后提交
(1)假设数据源是基于绑定在容器的JNDI上面,并且只有一个数据库
在spring配置文件中,为了演示的方便,我简略了一些代码,有些代码没有写出来,
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>jdbc/sample</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTrans
actionManager"
/>
<bean id="userDAO" class="net.xiaxin.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
<property name="transactionManager">
<ref local="transactionManager" />
</property>
</bean>
(2)在java的源文件中,是这样写的:
public class UserDAO {
private DataSource dataSource;
private PlatformTransactionManager transactionManager;
public PlatformTransactionManager getTransactionManager() {
return transactionManager;
}
public void setTransactionManager(PlatformTransactionManager
transactionManager) {
this.transactionManager = transactionManager;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insertUser() {
TransactionTemplate tt =
new TransactionTemplate(getTransactionManager());
tt.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
JdbcTemplate jt = new JdbcTemplate(getDataSource());
jt.update(
"insert into users (username) values ('xiaxin');");
jt.update(
"insert into users (id,username) values(2,
'erica');");
return null;
}
});
}
}
(3)其中我的问题是针对以上的java源代码,它如何体现了类似手动写代码时候的事务原理?
首先设置手动提交事务,然后提交?
产生这个问题的疑惑是:以下这段代码,Spring中的JdbcTemplate操作采用的是JDBC默认的AutoCommit模式,也就是说我们还
无法保证数据操作的原子性(要么全部生效,要么全部无效),
JdbcTemplate jt = new JdbcTemplate(getDataSource());
jt.update(
"insert into users (username) values ('xiaxin');");//执行这sql语句后,我认为应该马上提交,何来的事务?
jt.update(
"insert into users (id,username) values(2,
'erica');");//执行这sql语句后,我认为应该马上提交,何来的事务?
return null;
我的问题在于:::::::::
虽然,我举个例子(UserDAO类中,它已经获得一个transactionManager,而且,这个transactionManager已经获得了一个dataSource(不知道这样做有什么用?),好像这个transactionManager在UserDAO的事务中不起什么作用,反而起作用的JdbcTemplate 又体现不了手动写事务时的事务原理?为什么,请大家解释一下吧?