-
声明式事务管理方式一:基于TransactionProxyFactoryBean的方式 applicationContext.xml配置 <!-- 配置业务层代理 --> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 配置目标对象 --> <property name="target" ref="accountService"></property> <!-- 注入事务管理器 --> <property name="transactionManager" ref="transactionManager"></property> <!-- 注入事务属性 --> <property name="transactionAttributes" > <props> <!-- prop格式: * PROPAGATION :事务的传播行为 * ISOLATION :事务的隔离级别 * readOnly :只读(不可以进行修改,插入,删除的操作) * -Exception :发生哪些异常回滚事务 * +Exception :发生哪些异常事务不回滚 --> <prop key="*">PROPAGATION_REQUIRED,+java.lang.ArithmeticException</prop> </props> </property>查看全部
-
相关代码(下) AccountServiceImpl类 //注入事务管理模板 private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } public void transfer(final String out,final String in,final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.inMoney(in, money); int i=1/0; accountDao.outMoney(out, money); } }); }查看全部
-
编程式事务管理 相关代码(上) applicationContext.xml配置 <!-- 配置业务层类 --> <bean id="accountService" class="com.imooc.spring.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property> <!-- 注入事务管理模板 --> <property name="transactionTemplate" ref="transactionTemplate"></property> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置事务管理模板:spring为了简化事务管理的代码而提供的类 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"></property> </bean>查看全部
-
相关代码(下) 1.测试类 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringDemo1 { @Resource(name="accountService") private AccountService accountService; @Test public void demo1(){ accountService.transfer("aaa", "bbb", 200d); } }查看全部
-
相关代码(中) 1.applicationContext.xml配置 <!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!-- 配置c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="password" value="${jdbc.password}"></property> <property name="user" value="${jdbc.username}"></property> </bean> <!-- 配置业务层类 --> <bean id="accountService" class="com.imooc.spring.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"></property> </bean> <!-- 配置dao层类 --> <bean id="accountDao" class="com.imooc.spring.demo1.AccountDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean>查看全部
-
相关代码(上) 1.dao相关层 public interface AccountDao { public void outMoney(String out,Double money); public void inMoney(String in,Double money); } public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { public void outMoney(String out, Double money) { String sql="update account set money=money- ? where name= ?"; this.getJdbcTemplate().update(sql, money,out); } public void inMoney(String in, Double money) { String sql="update account set money=money+ ? where name= ?"; this.getJdbcTemplate().update(sql, money,in); } } 2.service相关层 public interface AccountService { public void transfer(String out,String in,Double money); } public class AccountServiceImpl implements AccountService { //注入转账dao类 private AccountDao accountDao; public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } public void transfer(String out, String in, Double money) { accountDao.outMoney(out, money); accountDao.inMoney(in, money); } }查看全部
-
Spring事务管理 1.编程式事务管理(很少使用) 2.使用XML配置声明式事务(通过AOP实现)查看全部
-
PlatformTransactionManager事务管理器 TransactionDefinition事务定义信息 TransactionStatus事务运行状态查看全部
-
事务的API介绍 一、简介 PlatformTransactionManager - 平台事务管理器,真正用来管理事务的接口,包含事务的提交,回滚等信息 TransactionDefinition - 事务定义信息(隔离级别、传播行为、是否超时、设置只读) TransactionStatus - 事务具体的运行状态(是否已经提交,是否有保存点,是不是一个新的事务等等这些状态) 关系: 首先会根据TransactionDefinition事务定义的信息(比如定义了什么样的隔离级别,定义什么样的传播行为),由PlatformTransactionManager对事务进行管理,进行事务管理的过程中,事务会产生一些相应的状态,这些状态在TransactionStatus中 二、PlatformTransactionManager 接口 1. DataSourceTransactionManager 使用Spring JDBC 或iBatis进行持久化数据时使用 2. HibernateTransactionManager 使用Hibernate3.0版本进行持久化数据时使用 三、TransactionDefinition 1.事务隔离级别 解决脏读、不可重复读、幻读等安全问题 事务隔离级别(四种): DEFAULT READ_UNCOMMITED READ_COMMITED REPEATABLE_READ SERIALIZABLE 2.事务的传播行为 解决业务层的方法之间的相互调用的问题(在调用方法的过程中,事务是如何传递的) 事务的传播行为有七种,又分为三类: 第一类共同点:A和B方法在同一个事务中。 *PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY 第二类共同点:A 方法和 B 方法不在同一个事务里面。 *PROPAGATION_REQUIRES_NEW PROPAGATION_NOT_SUPPORTED PROPAGATION_NEVER 第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。 *PROPAGATION_NESTED 四、TransactionStatus查看全部
-
事务隔离级别 作用:为了解决脏读、不可重复读、幻读等安全问题 脏读:一个事务读取了另一个事务改写但未提交的数据,如果这些数据被回滚,则读到的数据是无效的 不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同 幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录 事务隔离级别(四种): DEFAULT 使用后端数据库默认的隔离级别(Spring中的选择项) READ_UNCOMMITED 允许你读取还未提交的但是改变了的数据。可能导致脏读,幻读,不可重复读 READ_COMMITED 允许在并发事务已经提交后读取。可防止脏读,但是幻读,不可重复读仍可发生 REPEATABLE_READ 对于相同的字段的多次读取是一致的,除非数据被事务本身改变。可防止脏读,不可重复读,但幻读仍可能发生。 SERIALIZABLE 完全服从ACID的隔离级别,确保不会发生脏,幻,不可重复读。这在所有的隔离级别中是最慢的,它是典型的通过完全锁定在事务中涉及的数据表来完成的 Mysql默认的隔离级别 REPEATABLE_READ Oracle默认的隔离级别 READ_COMMITED查看全部
-
xml查看全部
-
PROPAGATION_NESTED:设定一个保存点,继续执行第二个服务,服务异常则回滚。查看全部
-
SpringJUnit4ClassRunner.class查看全部
-
TransactionTemplete事物控制查看全部
-
C3p0 配置查看全部
举报
0/150
提交
取消