事务
事务的隔离级别isolation
事务的传播机制propagation
业务方法A可能调用业务方法B,两个可能都加了事务注解,此时改以谁为准
REQUIRED: 支持当前事务(外部事务,即调用者A),如果不存在则创建新事务. A有事务就按A的来,没有则创建一个新事物
REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(B嵌套在A中执行,但B有独立的提交和回滚),否则就会REQUIRED一样.
声明式事务
用 @Transactional 注解
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public Object save1() {
// 新增用户
User user = new User();
user.setUsername("alpha");
user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
user.setEmail("[email protected]");
user.setHeaderUrl("http://image.nowcoder.com/head/99t.png");
user.setCreateTime(new Date());
userMapper.insertUser(user);
// 新增帖子
DiscussPost post = new DiscussPost();
post.setUserId(user.getId());
post.setTitle("Hello");
post.setContent("新人报道!");
post.setCreateTime(new Date());
discussPostMapper.insertDiscussPost(post);
// 令程序报个错,看是否回滚
Integer.valueOf("abc");
return "ok";
}
编程式事务
利用 TransactionTemplate 构造事务:
-
创建TransactionTemplate对象
-
给对象 设置隔离级别和传播机制
-
调用方法execute
execute( … ) 传入的参数有两种选择:
1)TransactionCallback 有返回值
2)TransactionCallbackWithoutResult 无返回值
TransactionCallback 有返回值
public Object getObject(String str) {
/*
* 执行带有返回值<Object>的事务管理
*/
transactionTemplate.execute(
// 接口泛型与重写方法的返回值一致
new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try {
//....... 业务代码
return new Object();
} catch (Exception e) {
//回滚
transactionStatus.setRollbackOnly();
return null;
}
}
});
}
TransactionCallbackWithoutResult 无返回值
public void update(String str) {
/*
* 执行无返回值的事务管理
*/
transactionTemplate.execute(
new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
try {
// .... 业务代码
} catch (Exception e){
//回滚
transactionStatus.setRollbackOnly();
}
}
});
}
实例
@Autowired
private TransactionTemplate transactionTemplate;
public Object save2() {
// 设置隔离级别 和 传播机制
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// 调用方法:execute(回调接口) 接口泛型与重写方法的返回值一致
return transactionTemplate.execute(new TransactionCallback<Object>() {
// 方法自动被调用
@Override
public Object doInTransaction(TransactionStatus status) {
// 新增用户
User user = new User();
user.setUsername("beta");
user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
user.setEmail("[email protected]");
user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
user.setCreateTime(new Date());
userMapper.insertUser(user);
// 新增帖子
DiscussPost post = new DiscussPost();
post.setUserId(user.getId());
post.setTitle("你好");
post.setContent("我是新人!");
post.setCreateTime(new Date());
discussPostMapper.insertDiscussPost(post);
// 设置错误
Integer.valueOf("abc");
return "ok";
}
});
}
参考文章
https://blog.csdn.net/qq_39248747/article/details/126877113
一些选择题
D
A
D
错误:B 改正:C
D
D-1709223415726)]
D
[外链图片转存中…(img-HQQCLtnR-1709223415726)]错误:B 改正:C
[外链图片转存中…(img-bvwAPUHr-1709223415726)]
D