spring - 开启一个事务,之后不管它了会怎样?

查看:399
本文介绍了spring - 开启一个事务,之后不管它了会怎样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

今天在搬砖的时候,由于之前的疏忽在开启事务之后,没有commit,导致出现问题,困扰了半天。。。

大致情况如下:
1.开启事务1(状态为开启没有提交)
2.开启事务2
3.数据库增删改操作
4.提交事务2

出现的问题:
1、在逻辑处理完,返回前台的时候页面卡主,无响应。
2、在数据库中可以执行查询操作,增删改卡主,查询数据库有锁。

请大家帮我分析一下。事务开启了没有提交,之后数据库会处于一种什么状态?怎么解除这种锁?内部的逻辑是什么?
为啥不会出现异常?或者说是不是我应该对于方法结束的时候要进行数据库事务的整体把控?

当然在开发过程中是不是尽量自动控制事务?

解决方案

结论:Oracle数据库使用事务机制来确保数据的一致性,当用户或系统发生问题时,就需要事务机制来确认先前发生的状态,数据库的事务机制是发生在第一个SQL语句执行时,结束于commit或rollback命令执行时, DDL(创建表等)或DCL(权限管理)语句执行时,以及用户正常离开时.

既然是指定oracle,我就针对oracle的事务机制说下吧.

通用DBMS的事务机制:

  1. 事务开启了没有提交或回滚,就会锁表?
    答:未必,不同的数据库对事务有不一样的处理.部分低版本数据库是没有事务的概念的(比如Access).没有提交会出现锁表(但是未必一定会影响对该表其他DML操作,需要看锁的粒度以及另一条sql的粒度),通常可以通过提交或回滚(TCL操作)以及kill该会话.但是commit只是我们知道的显式提交,还有其他的隐式提交的方法比如建表,截断等(DDL操作)这些操作都可以隐式提交当前事务.

  2. oracle对事务的一些处理:
    --Oracle使用了多版本读取一致性并发模型
    --Oracle不会升级锁的粒度
    --使用set transaction read only可以冻结会话至当前某个时间点,但是其他会话进行DML操作不会进行锁表.
    --无论事务处理的规模如何,提交都是非常快速的操作.并非事务处理越大(换句话说,影响的数据越多),提交所耗费时间越长.

  3. 当然在开发过程中是不是尽量自动控制事务?
    答:看业务场景,类似银行用户转账,你总不能某用户扣钱,自动提交,(突然断电)另一用户得到.

这篇关于spring - 开启一个事务,之后不管它了会怎样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆