首页 > 编程知识 正文

启动oracle数据库监听的命令是,springboot连不上数据库

时间:2023-05-04 07:07:18 阅读:154921 作者:640

说到事务管理,首先要明确事务的概念,理解为什么要进行事务管理。

事务管理是对一系列数据库操作进行管理的,是一个事务包含一个或多个SQL语句并进行逻辑管理的工作单位----百度百科

通常,每次使用后台同时操作数据库表时,都会访问事务。 如果,我可以保证我们在同一时间内不会多次访问数据库。 那你就不用办公管理了。

如果企业需要在同一时间段操作同一数据库表,则会出现以下问题:

脏读:一个事务读取到另一个事务中的未提交更新数据在同一事务中多次读取同一数据时返回的结果不同。 这意味着后续读取可以读取另一个事务提交的更新数据。 相反,“可重复”可确保在同一事务中多次读取数据时读取相同的数据。 这意味着在一个事务中两次查询的结果不匹配(更新操作);虚拟读取) :某个事务读取另一个事务提交的插入数据。 也就是说,在某个事务中,两次查询的结果不一致)的insert和delete操作

目前,在一个银行系统中,两个用户同时进行业务操作。 用户x )查询自己的余额; 用户y :向用户x的账户转账100元。 在用户y为转账之前,用户x查询到他的余额为200元。 用户y发起转账业务时,用户x可查询其余额为300元。 此时没有提交用户y的转账业务,用户x认为转账成功。 这是肮脏的阅读。

如果用户y的转账业务最后发生异常,无法提交业务,数据库将回滚业务。 那个时候,用户x查了自己的余额,就知道是200。 它对用户x来说,在同一业务中对同一数据有不同的查询结果。 这是不能重复读的事情。

那什么是幻读呢? 假设用户x在同一业务中查询了两次自己的流水记录。 用户y正好在用户x的两次询问中,转账到用户x。 该用户x在同一业务中,查询自己的流水记录的结果不同。 这就是幻读。

数据库表操作的并行性导致了几个系列问题。 为了解决这些问题,我们引入了事务管理。

事务管理有四个特性。

原子:事务中的操作单元不能断开。 全部成功或全部失败,在一致性:事务执行前后,业务状态和其他业务状态一致。 独立性3360在执行一个事务时,最好不要受到其他事务的影响。 当事务提交或回退时,此状态将全部持久化到数据库中的数据库事务中。 隔离级别有四种。 从低到高依次为:读已提交、读已提交、可还原读、可序列化。 如果设置事务的隔离级别,则在事务并行执行期间可能会发生脏读取、不可重复读取和幻读取。 但是,隔离级别越高,数据库的并发性越低。

读未提交:读取未提交的事务。 顾名思义,一个事务可以读取另一个未提交事务的数据。 这导致脏读、不可重复读、幻读等一系列问题。 因此,一般不建议在数据库事务中设置此隔离级别。 Read commited :读取提交,顾名思义,就是一个事务在另一个事务提交之前无法读取数据。 这样可以消除肮脏的阅读问题。 但是,这并不解决不能重复阅读的问题。 Repeatable read :重复读取是指读取数据(开始事务)时不再允许进行更改操作。 此隔离级别可以防止在同一事务中执行两次访问操作。 序列化:序列化。 Serializable是最高的事务隔离级别,可以连续执行事务,从而避免脏读、不可重复读和幻读。 但是,这种事务隔离级别效率低下,会消耗数据库性能,并不常见。 此外,如果事务嵌套在事务中,如何处理事务优先级以及事务的传播行为?

事务传播行为:事务传播行为用于描述当由一个事务传播行为限定的方法嵌套在另一个方法中时事务的传播方式。

公共void methoda () { methodB ); //dosomething } @ transaction (propagation=XXX ) public void methodB ) (/do something )代码中嵌套有methodA )方法事务传播行为限定的方法不需要在打开事务的外围方法中调用。

SpringBoot的@Transactional可以轻松声明如何管理事务。

使用传播属性管理事务的传播行为。

@ transactional (propagation=propagation.required )如果有事务,则添加事务,否则创建新的(默认) transactional (propagation.required )

容器不会打开此方法的事务@ transactional (propagation=propagation.requires _ new )

无论事务是否存在,都创建一个新事务。 原始挂起,新执行完成并继续旧事务@ transactional (propagation=propagation.m

ANDATORY)
必须在一个已有的事务中执行,否则抛出异常@Transactional(propagation=Propagation.NEVER)
必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)@Transactional(propagation=Propagation.SUPPORTS)
如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

使用 isolation 属性管理事务的隔离级别:

@Transactional(isolation = Isolation.READ_UNCOMMITTED)
读取未提交数据(会出现脏读, 不可重复读) 基本不使用@Transactional(isolation = Isolation.READ_COMMITTED)
读取已提交数据(会出现不可重复读和幻读)@Transactional(isolation = Isolation.REPEATABLE_READ)
可重复读(会出现幻读)@Transactional(isolation = Isolation.SERIALIZABLE)
串行化,事务之间不相互影响。

除此之外还有一些其他设置:
(1)事务的超时时间(默认是30秒)

@Transactional(timeout=30) //

(2)用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

@Transactional(rollbackFor={RuntimeException.class, Exception.class})@Transactional(rollbackFor=RuntimeException.class)

(3)用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。

@Transactional(rollbackForClassName=“RuntimeException”)@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})

(4)用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。

@Transactional(noRollbackFor=RuntimeException.class)@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

(5)该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚

@Transactional(noRollbackForClassName=“RuntimeException”)@Transactional(noRollbackForClassName={“RuntimeException”,“Exception”})

(6)用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false

@Transactional(readOnly=true)

注意事项

在默认的代理模式下,只有目标方法由外部调用,才能被 Spring 的事务拦截器拦截。在同一个类中的两个方法直接调用,是不会被 Spring 的事务拦截器拦截,就像上面的 save 方法直接调用了同一个类中的 method1方法,method1 方法不会被 Spring 的事务拦截器拦截。可以使用 AspectJ 取代 Spring AOP 代理来解决这个问题,但是这里暂不讨论。@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

学习文章
学习文章
学习文章
学习文章

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。