本文源码:GitHub·点这里 || gitEE·点这里一、事务管理简介事务基本概念一组业务操作ABCD,要么全部成功,要么全部不成功。特性:ACID原子性:整体一致性:完成隔离性:并发持久性:结果隔离问题脏读:一个事务读到另一个事务没有
事务基本概念
一组业务操作ABCD,要么全部成功,要么全部不成功。
特性:ACID
原子性:整体
一致性:完成
隔离性:并发
持久性:结果
隔离问题
脏读:一个事务读到另一个事务没有提交的数据
不可重复读:一个事务读到另一个事务已提交的数据(update)
虚读(幻读):一个事务读到另一个事务已提交的数据(insert)
隔离级别
read uncommitted:读未提交。
read committed:读已提交。解决脏读。
repeatable read:可重复读。解决:脏读、不可重复读。
serializable :串行化。都解决,单事务。
1)PlatfORMTransactionManager
平台事务管理器,spring要管理事务,必须使用事务管理器进行事务配置时,必须配置事务管理器。
2)TransactionDefinition
事务详情(事务定义、事务属性),spring用于确定事务具体详情,
例如:隔离级别、是否只读、超时时间 等
进行事务配置时,必须配置详情。spring将配置项封装到该对象实例。
3)TransactionStatus
事务状态,spring用于记录当前事务运行状态。例如:是否有保存点,事务是否完成。
spring底层根据状态进行相应操作。
PROPAGATION_REQUIRED , required , 必须 【默认值】 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将创建一个新的事务。PROPAGATION_SUPPORTS ,supports ,支持 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将以非事务执行。PROPAGATION_MANDATORY,mandatory ,强制 支持当前事务,A如果有事务,B将使用该事务。 如果A没有事务,B将抛异常。PROPAGATION_REQUIRES_NEW , requires_new ,必须新的 如果A有事务,将A的事务挂起,B创建一个新的事务 如果A没有事务,B创建一个新的事务PROPAGATION_NOT_SUPPORTED ,not_supported ,不支持 如果A有事务,将A的事务挂起,B将以非事务执行 如果A没有事务,B将以非事务执行PROPAGATION_NEVER ,never,从不 如果A有事务,B将抛异常 如果A没有事务,B将以非事务执行PROPAGATION_NESTED ,nested ,嵌套 A和B底层采用保存点机制,形成嵌套事务。掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED
基于转账的案例演示,基于druid连接池配置。druid连接池在文章。
SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), money INT)ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO account(username,money) VALUES('jack','10000');INSERT INTO account(username,money) VALUES('rose','10000');SELECT * FROM account;
该配置用于测试事务的手动管理。
@Bean(name = "transactionManager")public PlatformTransactionManager transactionManager (DruidDataSource dataSource){ LOGGER.info("【transactionManager 初始化...】"); DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); transactionManager.setDataSource(dataSource); return transactionManager;}@Bean(name = "transactionTemplate")public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager) LOGGER.info("【transactionTemplate 初始化...】"); TransactionTemplate transactionTemplate = new TransactionTemplate() ; transactionTemplate.setTransactionManager(transactionManager); return transactionTemplate;}
接口方法
public interface AccountService { void out (String outer , Integer money); void in (String inner , Integer money);}
接口实现
@Servicepublic class AccountServiceImpl implements AccountService { @Resource private JdbcTemplate jdbcTemplate ; public void out(String outer, Integer money) { String sql = "update account set money = money - ? where username = ?"; jdbcTemplate.update(sql, money,outer); } public void in(String inner, Integer money) { String sql = "update account set money = money + ? where username = ?"; jdbcTemplate.update(sql, money,inner); }}
测试接口
public interface TradeService { void trade1(String outer ,String inner ,Integer money); void trade2(String outer ,String inner ,Integer money); void trade3(String outer ,String inner ,Integer money);}
接口实现
@Servicepublic class TradeServiceImpl implements TradeService { @Resource private AccountService accountService ; @Resource private TransactionTemplate transactionTemplate ; @Override public void trade1(String outer, String inner, Integer money) { accountService.out(outer, money); // 抛出异常 int i = 1/0; accountService.in(inner, money); } @Override public void trade2(String outer, String inner, Integer money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { public void doInTransactionWithoutResult(TransactionStatus arg0) { accountService.out(outer, money); // 抛出异常 int i = 1/0; accountService.in(inner, money); } }); } @Transactional(value="transactionManager",propagation= Propagation.REQUIRED) @Override public void trade3(String outer, String inner, Integer money) { accountService.out(outer, money); // 抛出异常 int i = 1/0; accountService.in(inner, money); }}
@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = TransactionApplication.class)public class TradeTest { @Resource private TradeService tradeService ; @Test public void testTrade1 (){ tradeService.trade1("jack", "rose", 1000); } @Test public void testTrade2 (){ tradeService.trade2("jack", "rose", 1000); } @Test public void testTrade3 (){ tradeService.trade3("jack", "rose", 1000); }}
GitHub·地址https://github.com/cicadasmile/spring-boot-baseGitEE·地址Https://gitee.com/cicadasmile/spring-boot-base
--结束END--
本文标题: SpringBoot2 基础案例(12):基于转账案例,演示事务管理操作
本文链接: https://www.lsjlt.com/news/230094.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
2024-05-21
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0