@Transactiona注解的使用

https://blog.csdn.net/yalishadaa/article/details/70261973

当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题

并发事务所导致的问题可以分为下面三种类型 :

脏读:  对于两个事物 T1,T2, T1   读取了已经被 T2 更新但还没有被提交的字段 之后 , T2 回滚 ,T1 读取的内容就是临时且无效的 .
不可重复读: 对于两个事物 T1,T2, T1   读取了一个字段 , 然后 T2 更新了该字段 . 之后 ,T1 再次读取同一个字段 值就不同了 .
幻读: 对于两个事物 T1,T2, T1   从一个表中读取了一个字段 , 然后 T2 在该表中插入了一些新的行 . 之后 , 如果 T1 再次读取同一个表 , 就会多出几行 .
从理论上来说 事务应该彼此完全隔离 , 以避免并发事务所导致的问题 . 然而 , 那样会对性能产生极大的影响 , 因为事务必须按顺序运行 .
在实际开发中 为了提升性能 , 事务会以较低的隔离级别运行 .
事务的隔离级别可以通过隔离事务属性指定


事务的隔离级别要得到底层数据库引擎的支持 , 而不是应用程序或者框架的支持 .
Oracle 支持的 2 种事务隔离级别: READ_COMMITED, SERIALIZABLE
Mysql 支持 4 中事务隔离级别 .
事务的回滚通过 @Transactional  注解完成。
1.设置事务的隔离级别:
可以在  @Transactional isolation 属性中设置隔离级别.
2.设置事务的回滚属性
默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚.而受检查异常不会.
事务的回滚规则可以通过@Transactional注解的rollbackFor和noRollbackFor属性来定义.
ex:
[java]  view plain  copy
  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,  
  2.             noRollbackFor = {UserAccountException.class},  
  3.             )  
[java]  view plain  copy
  1. UserAccountException  
造成的异常都会被忽略。
[java]  view plain  copy
  1. rollbackFor:  遇到时必须进行回滚  
  2. noRollbackFor: 一组异常类,遇到时必须不回滚  
3.设置超时属性
超时事务属性: 事务在强制回滚之前可以保持多久.这样可以防止长期运行的事务占用资源.
ex:
[java]  view plain  copy
  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,  
  2.            noRollbackFor = {UserAccountException.class},  
  3.            timeout = 3)  
如果在函数中有任务执行时间大于3秒,就算没有异常抛出也会强制回滚。

4. 设置只读事务属性
表示这个事务只读取数据但不更新数据 , 这样可以帮助数据库引擎优化事务 .
ex:
[java]  view plain  copy
  1. @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED,  
  2.             noRollbackFor = {UserAccountException.class},  
  3.             readOnly = false,timeout = 1)  

在 Spring Boot 中,@Transactional 注解用于启用事务管理。它可以应用于类级别和方法级别。当它被应用在一个类上时,它将被应用于类中的所有方法。当它被应用在方法级别时,它仅应用于该方法。以下是@ Transactional 注解的用法: 在类级别使用 @Transactional 注解: ``` @Service @Transactional public class UserServiceImpl implements UserService { // code } ``` 在方法级别使用 @Transactional 注解: ``` @Service public class UserServiceImpl implements UserService { @Override @Transactional public void saveUser(User user) { // code } } ``` 在方法级别使用 @Transactional 注解时,可以使用 propagation 属性来指定事务传播行为。例如,以下是一个示例: ``` @Service public class UserServiceImpl implements UserService { @Override @Transactional(propagation = Propagation.REQUIRED) public void saveUser(User user) { // code } } ``` 在上述示例中,我们将 propagation 属性设置为 REQUIRED,它指示 Spring 在当前事务不存在时创建一个新事务,并在当前事务存在时使用当前事务。 @ Transactional 注解还有其他属性,例如 isolation、readOnly、timeout 等。这些属性用于控制事务的隔离级别、只读事务和超时。例如,以下是一个示例: ``` @Service public class UserServiceImpl implements UserService { @Override @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 10) public void saveUser(User user) { // code } } ``` 在上述示例中,我们将 isolation 属性设置为 DEFAULT,它指示 Spring 使用默认的事务隔离级别。我们将 readOnly 属性设置为 false,它指示 Spring 在事务中允许写操作。我们将 timeout 属性设置为 10,它指示 Spring 在 10 秒后将事务超时。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值