PlatformTransactionManager帮助我们管理任意平台的事务
每个框架都有管理平台的事务
jdbc管理事务的是DataSourceTransactionManager
hibernate ......HibernateTransactionManager
................................................TransactionManager
事务的四大特性(一致性,原子性,持久性,隔离性)
事务线程安全:脏读,不可重复读,幻读,读未提交
所有事务的操作分三步走:
开启事务---》提交事务---》回滚事务
spring管理事务,利用的是spring aop思想,将事务的操作织入到目标对象中
spring管理事务的属性
隔离级别:是否只读,事务的传播行为为(7种)

spring管理事务的方式
(1)代码式
配置事务管理对象
<!--配置事务管理对象--> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean>
|
配置事务管理的模板
<!--配置事务管理对象的模板--> <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>
|
在service中注入模板对象的execute方法
public class UserServiceImpl implements UserService { @Resource(name = "transactionTemplate") private TransactionTemplate tt;
/* public void setTt(TransactionTemplate tt) { this.tt = tt; } */ private UserDao userDao; @Override public void transform(Integer form, Integer to, Integer money) { tt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { userDao.increase(to,money); //设置异常查看事务是否生效 // int i=1/0; userDao.decrease(form,money); } });
}
public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
|
(2)xml配
配置事务管理对象置
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> |
配置事务管理对象的模板
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> |
配置通知
<tx:advice id="myAdvice" transaction-manager="transactionManager"> <tx:attributes> <!--userService中的方法--> <!--isolation隔离级别为4 propagation传播方式 read-only只读为false--> <tx:method name="transform" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"></tx:method> <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="update**" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method> <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/> <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method> <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"></tx:method> </tx:attributes> </tx:advice> |
(
标签名tx:advice id 给当前的事务起个标记,transactionManager配置刚刚的事务管理对象
配置参数:method name 可以是具体某个方法(方法名)比较麻烦,可以使用通配符的方式去设置
add* delete* update* get*
Persist* remove* modify* find*
要求命名规范
Isolation隔离级别使用默认即可,默认为4级别Default
propagation事务的椽笔行为默认为required
Reay-only是否为只读true/false
)
将通知织入到目标对象
配置切面不再使用aop;aspect而是advisor
<aop:config> <!--<aop:pointcut id="txPc" expression="execution(cn.hd.springTransaction.Impl.UserServiceImpl.transform)"></aop:pointcut>--> <aop:pointcut id="txPc" expression="execution(* cn.hd.springTransaction.Impl.*ServiceImpl.*(..))"></aop:pointcut> <aop:advisor advice-ref="myAdvice" pointcut-ref="txPc"></aop:advisor> </aop:config> |
userService书写
public class UserServiceImpl implements UserService { /* @Resource(name = "transactionTemplate") private TransactionTemplate tt;*/
/* public void setTt(TransactionTemplate tt) { this.tt = tt; } */ private UserDao userDao; @Override public void transform(Integer form, Integer to, Integer money) { /* tt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
} });*/
userDao.increase(to,money); //设置异常查看事务是否生效 // int i=1/0; userDao.decrease(form,money); }
public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
|
注解配置
开启注解模式
<!--配置事务管理对象--> <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!--配置事务管理对象的模板--> <bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>
<!--开启注解模式--> <tx:annotation-driven></tx:annotation-driven>
|
在想要设置事务的地方添加注解
可以有两个位置(1.类上面,该类中所有的方法都会使用以上参数的事务,2方法名上面,该方法使用参数中的事务)如果两个都设置则以方法名上面的事务为准
public class UserServiceImpl implements UserService { /* @Resource(name = "transactionTemplate") private TransactionTemplate tt;*/
/* public void setTt(TransactionTemplate tt) { this.tt = tt; } */
private UserDao userDao; @Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,readOnly = false) @Override public void transform(Integer form, Integer to, Integer money) { /* tt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
} });*/
userDao.increase(to,money); //设置异常查看事务是否生效 // int i=1/0; userDao.decrease(form,money); }
public UserDao getUserDao() { return userDao; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
|