问答平台(3),事务管理
什么是事务
- 事务是由N步数据库操作序列组成的逻辑执行单元,这些操作要么全执行,要么全不执行。
事务的特性(ACID)
1 |
|
常见的并发异常
1 |
|
第一类丢失更新
- 某一个事务的(回滚),导致另外一个事务已更新的数据丢失了。
第二类丢失更新
- 某一个事务的(提交),导致另外一个事务已更新的数据丢失了。
脏读
- 某一个事务,读取了另外一个事务(未提交)的数据。
不可重复读
- 某一个事务,对同一个数据(前后读取的结果)不一致。
幻读
- 某一个事务,对同一个表(前后查询到的行数)不一致。
事务的隔离级别
1 |
|
实现机制
悲观锁(数据库)
1 |
|
乐观锁(自定义)
1 |
|
Spring事务管理
声明式事务
1 |
|
1 |
|
编程式事务
- 通过 TransactionTemplate 管理事务, 并通过它执行数据库的操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35// AlphaService.java
@Autowired
private TransactionTemplate transactionTemplate;
public Object save2() {
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
// 新增用户
User user = new User();
user.setUsername("beta");
user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
user.setEmail("beta@qq.com");
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";
}
});
}
测试类
1 |
|
问答平台(3),事务管理
https://lcf163.github.io/2020/05/12/问答平台(3),事务管理/