事务管理-spring

简介: 事务管理-spring

什么是事务


- 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。

• 事务的特性(ACID)

- 原子性(Atomicity):事务是应用中不可再分的最小执行体。

- 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。

- 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。

- 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。


事务的隔离性


• 常见的并发异常

- 第一类丢失更新、第二类丢失更新。

- 脏读、不可重复读、幻读。

• 常见的隔离级别

- Read Uncommitted:读取未提交的数据。

- Read Committed:读取已提交的数据。

- Repeatable Read:可重复读。

- Serializable:串行化

第一类丢失更新 :某一个事务的回滚, 导致另外一个事务已更新的数据丢失了。

第二类丢失更新 :某一个事务的提交, 导致另外一个事务已更新的数据丢失了。

脏读 :某一个事务, 读取了另外一个事务未提交的数据

不可重复读 :某一个事务, 对同一个数据前后读取的结果不一致

幻读 :某一个事务, 对同一个表前后查询到的行数不一致



• 悲观锁(数据库)

- 共享锁(S锁) 事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁。

- 排他锁(X锁) 事务A对某数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁。

• 乐观锁(自定义)

- 版本号、时间戳等 在更新数据前,检查版本号是否发生变化。若变化则取消本次更新,否则就更新数据(版本号+1)。


Spring事务管理 • 声明式事务


- 通过XML配置,声明某方法的事务特征。

- 通过注解,声明某方法的事务特征。

• 编程式事务 - 通过 TransactionTemplate 管理事务, 并通过它执行数据库的操作

 

案例代码


1. // REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
2. // REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
3. // NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
4. @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
5. public Object save1() {
6. // 新增用户
7. User user = new User();
8.         user.setUsername("alpha");
9.         user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
10.         user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
11.         user.setEmail("alpha@qq.com");
12.         user.setHeaderUrl("http://image.nowcoder.com/head/99t.png");
13.         user.setCreateTime(new Date());
14.         userMapper.insertUser(user);
15. 
16. // 新增帖子
17. DiscussPost post = new DiscussPost();
18.         post.setUserId(user.getId());
19.         post.setTitle("Hello");
20.         post.setContent("新人报道!");
21.         post.setCreateTime(new Date());
22.         discussPostMapper.insertDiscussPost(post);
23. 
24. //这步报错,观测是否回滚
25.         Integer.valueOf("abc");
26. 
27. return "ok";
28.     }
29. 
30. public Object save2() {
31.         transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
32.         transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
33. 
34. return transactionTemplate.execute(new TransactionCallback<Object>() {
35. @Override
36. public Object doInTransaction(TransactionStatus status) {
37. // 新增用户
38. User user = new User();
39.                 user.setUsername("beta");
40.                 user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
41.                 user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
42.                 user.setEmail("beta@qq.com");
43.                 user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
44.                 user.setCreateTime(new Date());
45.                 userMapper.insertUser(user);
46. 
47. // 新增帖子
48. DiscussPost post = new DiscussPost();
49.                 post.setUserId(user.getId());
50.                 post.setTitle("你好");
51.                 post.setContent("我是新人!");
52.                 post.setCreateTime(new Date());
53.                 discussPostMapper.insertDiscussPost(post);
54. 
55. //这步报错,观测是否回滚
56.                 Integer.valueOf("abc");
57. 
58. return "ok";
59.             }
60.         });
61.     }
目录
相关文章
|
6月前
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
487 3
|
2月前
|
Java 数据库连接 数据库
Spring基础3——AOP,事务管理
AOP简介、入门案例、工作流程、切入点表达式、环绕通知、通知获取参数或返回值或异常、事务管理
Spring基础3——AOP,事务管理
|
3月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
3月前
|
Java Spring 开发者
掌握Spring事务管理,打造无缝数据交互——实用技巧大公开!
【8月更文挑战第31天】在企业应用开发中,确保数据一致性和完整性至关重要。Spring框架提供了强大的事务管理机制,包括`@Transactional`注解和编程式事务管理,简化了事务处理。本文深入探讨Spring事务管理的基础知识与高级技巧,涵盖隔离级别、传播行为、超时时间等设置,并介绍如何使用`TransactionTemplate`和`PlatformTransactionManager`进行编程式事务管理。通过合理设计事务范围和选择合适的隔离级别,可以显著提高应用的稳定性和性能。掌握这些技巧,有助于开发者更好地应对复杂业务需求,提升应用质量和可靠性。
46 0
|
4月前
|
Java 数据库连接 API
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
280 1
|
5月前
|
Java 开发者 Spring
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
深入解析 @Transactional:Spring 事务管理的艺术及实战应对策略
|
4月前
|
Java Spring
解析Spring Boot中的事务管理机制
解析Spring Boot中的事务管理机制
|
5月前
|
XML Java 数据库
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
Spring5系列学习文章分享---第五篇(事务概念+特性+案例+注解声明式事务管理+参数详解 )
32 0
|
5月前
|
Java Spring
Spring Boot中的事务管理策略
Spring Boot中的事务管理策略
|
5月前
|
XML Java 数据库
在Spring框架中,事务管理是一个重要的功能
在Spring框架中,事务管理是一个重要的功能
18 0
下一篇
无影云桌面