jdbc.properties:
driver = com.mysql.jdbc.Driver url = jdbc:mysql:///SMDB?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false usr = root password = admin location = /Users/jerry/.m2/repository/mysql/mysql-connector-java/8.0.17/mysql-connector-java-8.0.17.jar 测试代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Test1 { @Autowired private StudentMapper studentMapper; @Test public void test(){ Student student = studentMapper.selectByPrimaryKey(1); System.out.println(student); } } 编码式事务编码式事务,即在源代码中加入 事务处理的代码, 即commit,rollback等,这是非常原始的做法仅作为了解
纯手动管理事务配置文件:
<!-- 在之前的配置中添加内容--> <!--事务管理器--> <bean> <property ref="dataSource"/> </bean> <!-- 事务定义 --> <bean> <!-- 隔离级别 可缺省--> <property value="ISOLATION_REPEATABLE_READ"/> <!-- 传播行为 可缺省--> <property value="PROPAGATION_REQUIRED"/> </bean>测试代码:
@Autowired private StudentMapper studentMapper; @Autowired private DataSourceTransactionManager manager; @Autowired private DefaultTransactionDefinition definition; @Test public void test(){ TransactionStatus transactionStatus = manager.getTransaction(definition); try{ Student student = studentMapper.selectByPrimaryKey(1); System.out.println(student); student.setAge(201); studentMapper.updateByPrimaryKey(student); int i = 1/0; manager.commit(transactionStatus); }catch (Exception e){ e.printStackTrace(); manager.rollback(transactionStatus); } }上述代码仅用于测试事务处理的有效性;
我们已经在Spring中配置了MyBatis,并进行了事务处理,但是没有解决重复代码的问题
使用事务模板事务模板原理是将要执行的具体代码交给模板,模板会在执行这写代码的同时处理事务,当这写代码出现异常时则自动回滚事务,以此来简化书写
配置文件:
<!-- 在上述配置基础上删除事务定义 添加模板Bean--> <bean> <!-- 传播行为隔离级别等参数 可缺省--> <property value="PROPAGATION_REQUIRED"/> <property ref="transactionManager"/> </bean>测试代码:
public class Test2 { @Autowired private StudentMapper studentMapper; @Autowired private TransactionTemplate transactionTemplate; @Test public void test(){ transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus transactionStatus) { Student student = studentMapper.selectByPrimaryKey(1); System.out.println(student); student.setAge(1101); studentMapper.updateByPrimaryKey(student); // int i = 1/0; return null; } }); } }可以看到事务模板要求提供一个实现类来提交原始的数据库操作给模板,从而完成事务代码的增强
无论是纯手动管理还是利用模板,依然存在大量与业务无关的重复代码,这也是编码式事务最大的问题;
声明式事务