当前位置:网站首页>5. Transaction management
5. Transaction management
2022-08-02 15:32:00 【Caviar :P】
1.事务特性
2.事务的隔离性
- 常见的并发异常
- 第一类丢失更新、第二类丢失更新.
- 脏读、不可重复读、幻读.
第一类丢失更新:某一个事务的回滚,导致另外一个事务已更新的数据丢失了.
第二类丢失更新:某一个事务的提交,导致另外一个事务已更新的数据丢失了.
脏读:某一个事务,读取了另外一个事务未提交的数据.
不可重复读:某一个事务,对同一个数据前后读取的结果不一致. (The result of querying a piece of data is inconsistent)
幻读:某一个事务,对同一个表前后查询到的行数不一致.(The results of querying multiple pieces of data are inconsistent)
- 常见的隔离级别
- Read Uncommitted:读取未提交的数据.
- Read Committed:读取已提交的数据.
- Repeatable Read:可重复读.
- Serializable:串行化.
3.实现机制
- 悲观锁(数据库)
- 共享锁(S锁)
事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁. - 排他锁(X锁)
事务A对某数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁.
- 共享锁(S锁)
- 乐观锁(自定义)
- 版本号、时间戳等
在更新数据前,检查版本号是否发生变化.若变化则取消本次更新,否则就更新数据(版本号+1).
- 版本号、时间戳等
4.Spring事务管理
No matter what the underlying database is,它的api都是一套
- 声明式事务
- 通过XML配置,声明某方法的事务特征.(This project uses this)
- 通过注解,声明某方法的事务特征.
- 编程式事务
- 通过 TransactionTemplate 管理事务,并通过它执行数据库的操作.
声明式事务
在 @Transactional The isolation mechanism and propagation mechanism are defined on the annotation.当save1()After an error occurs in the method,The whole method rolls back,插入数据库失败.
// REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
// REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
// NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
@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";
}
编程式事务
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 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";
}
});
}
边栏推荐
猜你喜欢
Win11声卡驱动如何更新?Win11声卡驱动更新方法
IPV4和IPV6是什么?
5.事务管理
CI24R1小模块2.4G收发模块无线通信低成本兼容si24r1/XN297超低功耗
How to reinstall Win7 system with U disk?How to reinstall win7 using u disk?
Mysql之MVCC
MATLAB绘图函数ezplot入门详解
Win10安装了固态硬盘还是有明显卡顿怎么办?
Open the door of electricity "Circuit" (1): voltage, current, reference direction
Configure clangd for vscode
随机推荐
Use libcurl to upload the image of Opencv Mat to the file server, based on two methods of post request and ftp protocol
MATLAB图形加标注的基本方法入门简介
Mysql连接错误解决
win10任务栏不合并图标如何设置
Network Security Packet Capture
7.Redis
STM32LL库使用——SPI通信
Publish module to NPM should be how to operate?Solutions to problems and mistake
C语言函数参数传递模式入门详解
A clean start Windows 7?How to load only the basic service start Windows 7 system
Open the door of power and electricity "Circuit" (2): Power Calculation and Judgment
背包问题-动态规划-理论篇
word方框怎么打勾?
二叉树遍历之后序遍历(非递归、递归)入门详解
Codeforces Round #624 (Div. 3)
flink+sklearn——使用jpmml实现flink上的机器学习模型部署
pygame image rotate continuously
General code for pytorch model to libtorch and onnx format
如何用硬币模拟1/3的概率,以及任意概率?
Please make sure you have the correct access rights and the repository exists.问题解决