文章目录
帖子详情
DiscusPostMapper
增加查看帖子的方法
//增加查看帖子的方法
DiscussPost selectDiscussPostById(int id);
//在discuss-mapper.xml中
<!-- 实现查看帖子的select语句 -->
<select id="selectDiscussPostById" resultType="DiscussPost">
select <include refid="selectFields"></include>
from discuss_post
where id = #{id}
</select>
DiscussPostService
增加一个查询方法
//添加一个查看帖子的方法
public DiscussPost findDiscussPostById (int id) {
return discussPostMapper.selectDiscussPostById(id);
}
DiscussPostController
在controller处理查询请求
//处理查看帖子的请求
@RequestMapping(path = "/detail/{discussPostId}", method = RequestMethod.GET)
public String getDiscussPost(@PathVariable("discussPostId") int discussPostId, Model model) {
//查询帖子
DiscussPost post = discussPostService.findDiscussPostById(discussPostId);
model.addAttribute("post", post);
//查询帖子的作者
User user = userService.findUserById(post.getUserId());
model.addAttribute("user", user);
return "/site/discuss-detail";
}
index.html
- 在帖子标题上增加访问详情页面的链接
discuss-detail.html
-
处理静态资源的访问路径
-
复用index.html的header区域
-
显示标题、作者、发布时间、帖子正文等内容
事务管理
为添加评论做准备
回顾
- 什么是事务
事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。 - 事务的特性(ACID)
- 原子性(Atomicity):事务是应用中不可再分的最小的执行体。
- 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。
- 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
- 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。
事务的隔离性(面试重要)
- 常见的并发异常
- 第一类丢失更新、第二类丢失更新。
- 脏读、不可重复读、幻读。
- 常见的隔离级别(由上到下安全级别逐级递增) ---- 互联网应用中一般都选择中间的级别,因为它既能满足我业务的需要,保证我业务的安全性
- Read Uncommitted:读取未提交的数据。
- Read Committed:读取已提交的数据。
- Repeatable Read:可重复读。
- Serializable:串行化,序列化。可以解决所有的并发异常,但是它需要对数据加锁,而加锁会降低数据库处理的性能,使得性能下降得很快。
第一类丢失更新:如果不做事务的隔离,就会发生这样的问题
第二类丢失更新:
脏读:
不可重复读:查询一条数据导致不一致
幻读:查询多条数据导致不一致
实现机制 — 数据库保障事务的实现
- 悲观锁(数据库自带的实现机制) – 其认为如果并发就一定会有问题,必须提前加锁
- 共享锁(S锁)
事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,不能加排他锁。 - 排他锁(X锁)
事务A对某数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁。
- 共享锁(S锁)
- 乐观锁(自定义)
- 版本号、时间戳等
在更新数据前,检查版本号是否发生变化。若变化则取消本次更新,否则就更新数据(版本号+1)
- 版本号、时间戳等
Spring事务管理
Transaction Management
声明式事务 – 平常优选选第一种,简单
-
通过XML配置,声明某方法的事务特征。
-
通过注解,声明某方法的事务特征
编程式事务 – 业务逻辑复杂,选择第二种
- 通过 TransactionTemplate 管理事务,并通过它执行数据库的操作。