精华内容
下载资源
问答
  • Oracle未提交事务引起的锁

    千次阅读 2018-09-17 23:46:19
    1. 中间件有线程执行了Delete语句之后,一直处于等待状态,没有COMMIT提交事务,对表施加了行锁且该线程无法复用(中间件总线程数有限制) 2. 对表施加了行锁之后,后续中间件线程如果需要修改该行,将被阻塞。 ...

    笔者所在公司最近上了一套系统,系统使用中间件连接Oracle数据库,使用一段时间之后系统就会停止响应。发现问题在于2点:

    1. 中间件有线程执行了Delete语句之后,一直处于等待状态,没有COMMIT提交事务,对表施加了行锁且该线程无法复用(中间件总线程数有限制)

    2. 对表施加了行锁之后,后续中间件线程如果需要修改该行,将被阻塞。

    以上两个因素不断发生,最终导致中间件线程数耗尽,系统停止响应。

    下面会分两个部分,第一个部分是直接给出判断以上故障的SQL语句,第二部分是通过做实验的方法重现问题

     1.直接判断未提交事务引起的表的行锁

    1.1  判断哪个SESSION执行了DML(Insert/Update/Delete) 但是未提交 (Commit ),引起的行锁

    --找到修改了数据,但是未提交的Session,选择WAIT_CALSS='Idle',也就是Session处于休息状态,但是有锁定的表
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE A.WAIT_CLASS='Idle'
    AND A.SECONDS_IN_WAIT>10/*SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒*/
    
           SID    SERIAL# USERNAME                       EVENT                                                            WAIT_CLASS                                                       SECONDS_IN_WAIT PREV_EXEC_START LOCKED_MODE OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE
    ---------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------------- --------------- ----------- ------------------------------ -------------------------------------------------------------------------------- -------------------
           194        240 TEST                           SQL*Net message from client                                      Idle                                                                       18046 2018/9/17 18:30           3 TEST                           TESTLOCK                                                                         TABLE
    

    如果确认这些SESSION确实有问题,可以直接KILL掉,传入前面语句的SID和SERIAL#

    ALTER SYSTEM KILL SESSION 'SID,SERIAL#'

    注:ORACLE有个很有趣的地方,就是KILL SESSION的时候需要填“”SERIAL#“,是为了避免刚刚查询的时候获得了一个SID,然后你打算杀掉他,在这个时间之间,打算杀掉的SESSION结束了断开连接,然后新的SESSION复用了这个SID,也就是避免误杀,SQL SERVER 直接KILL可以了。

    1.2  判断哪些SESSION被阻塞了,且定位到是谁阻塞了,是由于哪个表哪个行引起的阻塞

    --当SESSION被阻塞,通过ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#这几个字段找到ROWID,然后通过ROWID找到被锁定的记录
    SELECT BLOCKING_SESSION,SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
            ,dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE BLOCKING_SESSION IS NOT NULL ;
    
           SID    SERIAL#     AUDSID PADDR                 USER# USERNAME                       EVENT                                                            WAIT_CLASS                                                       SECONDS_IN_WAIT ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# BLOCKING_SESSION_STATUS BLOCKING_INSTANCE BLOCKING_SESSION OWNER                          OBJECT_NAME                                                                      OBJECT_TYPE         DBMS_ROWID.ROWID_CREATE(1,ROW_
    ---------- ---------- ---------- ---------------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------------- ------------- -------------- --------------- ------------- ----------------------- ----------------- ---------------- ------------------------------ -------------------------------------------------------------------------------- ------------------- ------------------------------
            12       4449 4294967295 00007FFFF04DDFA0          0 SYS                            enq: TX - row lock contention                                    Application                                                                18245         75465              4             175             1 VALID                                   1              194 TEST                           TESTLOCK                                                                         TABLE               AAASbJAAEAAAACvAAB
    

     

    通过上面返回的OBJECT_NAME 和ROWID,知道是由于那个行引起的阻塞

    SELECT * FROM 前面返回的表名称
    where ROWID=前面返回的ROWID
    
    SQL> select * from test.TESTLOCK where rowid='AAASbJAAEAAAACvAAB';
            ID NAME
    ---------- --------------------------------------------------------------------------------
             2 kkkkkkkkkkkkkk

    1.3哪些session阻碍了,哪些被阻碍了以及执行的Sql语句

    SQL> SELECT s.BLOCKING_SESSION, l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
      2         l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
      3       FROM v$sqlarea a,v$session s, v$locked_object l
      4      WHERE l.session_id = s.sid
      5        AND s.prev_sql_addr = a.address
      6  ORDER BY sid, s.serial#;
    BLOCKING_SESSION        SID    SERIAL# LOCKED_MODE ORACLE_USERNAME                     USER# OS_USER_NAME                   MACHINE                                                          TERMINAL         SQL_TEXT                                                                         ACTION
    ---------------- ---------- ---------- ----------- ------------------------------ ---------- ------------------------------ ---------------------------------------------------------------- ---------------- -------------------------------------------------------------------------------- ----------------------------------------------------------------
                 194         12       4449           3 SYS                                     0 DIGITAL-CAIYH\CaiYH            WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH    update test.testlock set name='kkkkkkkkkkkkkk' where id=2                        
                            194        240           3 TEST                                   86 DIGITAL-CAIYH\CaiYH            WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH    update testlock set name='eeeeeeeeee' where id=2                                 
    
    SQL> 

    1.4 查询那张表被锁定 被谁锁定

     --查询那张表被锁定 被谁锁定
     select s.sid,
               s.serial#,
               lo.oracle_username,
               lo.os_user_name,
               ao.object_name  as 被锁表名称table_locked_name,
               s.username,
               s.schemaname,
               s.osuser,
               s.process,
               s.machine,
               s.terminal,
               lo.locked_mode
          from v$locked_object lo, all_objects ao, v$session s
         where ao.object_id = lo.object_id
           and lo.session_id = s.sid
         order by s.sid asc;
    
           SID    SERIAL# ORACLE_USERNAME                OS_USER_NAME                   被锁表名称TABLE_LOCKED_NAME    USERNAME                       SCHEMANAME                     OSUSER                         PROCESS                  MACHINE                                                          TERMINAL         LOCKED_MODE
    ---------- ---------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------ ---------------------------------------------------------------- ---------------- -----------
            12       4449 SYS                            DIGITAL-CAIYH\CaiYH            TESTLOCK                       SYS                            SYS                            DIGITAL-CAIYH\CaiYH            9480:21728               WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH              3
           194        240 TEST                           DIGITAL-CAIYH\CaiYH            TESTLOCK                       TEST                           TEST                           DIGITAL-CAIYH\CaiYH            15212:12596              WORKGROUP\DIGITAL-CAIYH                                          DIGITAL-CAIYH              3
    

    2.通过实验过程重现整个过程

    首先说明,Oracle数据库是写阻塞写,读写之间是互相不阻塞的,也就是以下两个语句在不同的窗口(SESSION)执行的话,由于它们都是更新同一行,如果第一个执行的没有COMMIT,后执行那个会一直处于被阻塞状态:

     

    --第一个窗口执行如下语句
    UPDATE TESTLOCK
    SET AAA=11
    WHERE AAA=1
    
    --第二个窗口执行以下语句
    UPDATE TESTLOCK
    SET AAA=12
    WHERE AAA=1

    下面开始我们的实验,Oracle的版本是11G 带着如下问题:

    1. 如何知道一个连接修改了数据,但是未提交,导致对表产生了锁定?
    2. 对于1的疑问,可否知道具体锁定了哪个表的哪个记录?

    首先我们在PS/SQL客户端建立三个窗口,分别为:测试窗口1、测试窗口2、观察窗口,实验以“TEST”账号登录,为了避免其他SESSION干扰我们的实验,很多语句添加了“WHERE USERNAME='TEST'“作为限定

    ,如果想重复实验过程,需要修改这部分语句。

    1.在测试窗口1建立测试用的表,并插入10条记录

     

    /*初始化测试表*/
    
    --建立一个测试表
    create table TESTLOCK
    (
      aaa number not null,
      bbb nvarchar2(10) not null,
      ccc nvarchar2(10) not null
    );
    create INDEX PK_TESTLOCK on TESTLOCK (aaa);
    
     
    --随便插入点数据
    INSERT INTO TESTLOCK VALUES ('1','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('2','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('3','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('4','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('5','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('6','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('7','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('8','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('9','BBB','CCC');
    INSERT INTO TESTLOCK VALUES ('10','BBB','CCC');
    
     
    --然后我们的表里面就有了一些数据
    SELECT * FROM TESTLOCK;
    COMMIT;

    2.在测试窗口2,查询测试表 ,可以看到步骤1添加的10条记录

    SELECT * FROM TESTLOCK;

     

    3.在观察窗口观察当前Session的情况和表锁的情况 

    这里我们用到了Oracle的三个系统试图

    V$SESSION:
    
    V$LOCK:
    
    V$LOCKED_OBJEC:

     

    --当前的Session情况
    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,      BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION
    FROM V$SESSION
    WHERE USERNAME='TEST';
    
    --当前TESTLOCK表锁的情况
    SELECT * FROM V$LOCK
    WHERE TYPE='TM'
    AND ID1=(SELECT OBJECT_ID FROM DBA_OBJECTS
                     WHERE OBJECT_NAME='TESTLOCK');
    
    SELECT XIDUSN,XIDSLOT,XIDSQN,OBJECT_ID,SESSION_ID,ORACLE_USERNAME,PROCESS,LOCKED_MOD
    FROM V$LOCKED_OBJEC
    WHERE OBJECT_ID=(SELECT OBJECT_ID FROM DBA_OBJECTS
                     WHERE OBJECT_NAME='TESTLOCK');

    从下图可以看出TEST账号一共产生了4个SESSION,分别是PLSQL本身连接到数据库和我们建立的三个窗口 

    我们关注几个字段:

    EVENT:oracle的session正在等待的数据或者事件

    WAIT_CLASS:等待事件的名称

    blocking_session_status:如果blocking_session_status字段是VALID,表示该SESSION被阻塞了

    blocking_session:被哪个Session阻塞

    通过以上4项观察,没有任何Session被阻塞,当前三个Session处于等待客户端消息状态(EVENT=SQL*Net message from client, WAIT_CLASS=Idle),剩下一个Session正在向客户端发送消息(EVENT=SQL*Net message to client,WAIT_CLASS=Network),就是我们当前的观察窗口

    后面两个查询V$LOCK和V$LOCKED_OBJECT的语句没有任何返回,表示当前TESTLOCK表没有被锁定

     

    4. 在测试窗口1更新表TESTLOCK,但是不要提交(Commit)

    UPDATE TESTLOCK
    SET AAA=11
    WHERE AAA=1

    PL/SQL左上角会展示提交和回滚的图标,表示事务没有提交

     

    5.再次在观察窗口执行步骤3的语句:

    通过对V$LOCK和V$LOCKED_OBJECT的查询可以知道,SID=1947 锁定了TESTLOCK表,其中LMODE=3(行级排他锁,我们这里是通过UPDATE产生的)

     

    锁模式

    锁描述

    解释

    SQL操作

    0

    none

     

     

    1

    NULL

    Select

    2

    SS(Row-S)

    行级共享锁,其他对象只能查询这些数据行

    Select for update

    Lock for update

    Lock row share

    3

    SX(Row-X)

    行级排它锁,在提交前不允许做DML操作

    Insert/update/Delete

    Lock row share

    4

    S(Share)

    共享锁

    Create index

    Lock share

    5

    SSX(S/Row-X)

    共享行级排它锁

    Lock share row exclusive

    6

    X(Exclusive)

    排它锁

    Alter table

    Drop able

    Drop index

    Truncate table

    Lock exclusive

     

    6.回到之前的第一个问题,如何知道一个SESSION修改了数据但是没COMMIT,在观察窗口执行如下语句:

     

    --找到修改了数据,但是未提交的Session,选择WAIT_CALSS='Idle',也就是Session处于休息状态,但是有锁定的表
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE A.WAIT_CLASS='Idle'
    AND A.SECONDS_IN_WAIT>10/*SESSION空闲后一段时间还锁定的才算有问题,这里随便给了个数值10秒*/
    AND USERNAME='TEST';

    只需要判断WAIT_CLASS='Idle',同时在V$LOCKED_OBJECT存在锁定的对象且SESSION空闲了一段时间,如图,就可以判断SID=1947 锁定了TESTLOCK表,SECONDS_IN_WAIT就可以认为是锁定的时长,单位是秒 

     

    7.在观察窗口执行以下语句,从事务的角度观察

     

    --从事务角度观察,连接v$session和v$transaction
    SELECT A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.START_DATE
    FROM v$session a
    INNER JOIN v$transaction b
    ON a.taddr=b.addr
    WHERE USERNAME='TEST'

    连接两个视图后,可以知道SID=1947启动了事务

     

    8.接下来我们来验证在测试窗口2更新和删除记录,但是更新和删除的记录和测试窗口1的不是同一条记录,测试窗口1更新的记录为AAA=1,在更新和删除后马上提交(COMMIT)

     

    --更新和测试窗口1不同的记录
    UPDATE TESTLOCK
    SET AAA=100
    WHERE AAA=2;
    COMMIT ;
    
    --删除和测试窗口1不同的记录
    DELETE FROM TESTLOCK
    WHERE AAA=3;
    COMMIT;
    
    SELECT * FROM TESTLOCK;

    可以看到更新和删除都没有被阻塞,查询表结果如图,可以看到AAA=2的数据被更新了,AAA=3的数据被删除,AAA=1的数据还是和原来一样,即看不到测试窗口1的数据更新,也就是凡是没有提交的数据都是看不到的。

     

    9.下面来验证:在前面一个UPDATE没有提交的情况下,另外一个连接修改TESTLOCK的同一条记录,会发生什么?

    在测试窗口2执行以下语句:但是不要提交(COMMIT)

    --更新和测窗口1相同的记录
    UPDATE TESTLOCK
    SET AAA=12
    WHERE AAA=1

    该语句会一直处于“正在执行”状态,实际上就是TESTLOCK上面有行锁,该SESSION一直在等待之前的行锁释放 

     

    10.再次在观察窗口执行步骤3的语句:

    观察SID=9,显示EVENT='enq: TX - row lock contention' ,表示正在等待一个行锁释放,BLOCKING_SESSION 说明该SESSION被SID=1947 阻塞了,也就是测试窗口1的SESSION

    观察V$LOCK其实区分不了哪个LOCK是没提交,哪个是,两个LOCK的显示都是一样的,这点倒很奇怪

     

    观察V$LOCKED_OBJECT,可以通过XINUSN/XIDSLOT/XIDSQN 判断,这三个字段是和回滚相关的字段,如果都为0,可以判断为被阻塞

     

    11. 寻找被锁定的具体行

    在观察窗口执行如下语句:

     

    --当SESSION被阻塞,通过ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#这几个字段找到ROWID,然后通过ROWID找到被锁定的记录
    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
            ,dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)
    FROM V$SESSION A
    INNER JOIN V$LOCKED_OBJECT B
    ON A.SID=b.SESSION_ID
    INNER JOIN DBA_OBJECTS C
    ON B.OBJECT_ID=c.OBJECT_ID
    WHERE USERNAME='TEST'
    AND BLOCKING_SESSION IS NOT NULL ;

     获得具体被阻塞表的ROWID,语句是dbms_rowid.rowid_create(1,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#)

    查询获得具体的被阻塞记录,正好是我们在测试窗口1  Update的记录

    --通过前面的函数rowid_create获得具体的ROWID,然后在锁定表中查询记录
    SELECT * FROM TESTLOCK
    where ROWID='AAJ2QDAAnAAGrwnAAA'

     

     

    12.杀死阻塞了其他连接的SESSION

    从前面可见是SESSION 1947 阻塞了当前线程,查询获得SID=1947,查询其SERIAL#,然后执行SQL杀死该SESSION

    ALTER SYSTEM KILL SESSION '1947,63353'

     13. 再次观察当前SESSION情况,SID=9,不再是阻塞状态

     

    SELECT SID,SERIAL#,AUDSID,PADDR,USER#,USERNAME,EVENT,WAIT_CLASS,SECONDS_IN_WAIT,ROW_WAIT_OBJ#,ROW_WAIT_FILE#,ROW_WAIT_BLOCK#,ROW_WAIT_ROW#,
            BLOCKING_SESSION_STATUS,BLOCKING_INSTANCE,BLOCKING_SESSION
    FROM V$SESSION
    WHERE USERNAME='TEST';

     

     

    展开全文
  • 这种情况在平时项目也会出现 事物未提交的情况。 那么问题来了,事物未提交导致锁等待如何解决? 接下来分析定位及如何解决问题: 查看当前连接Id(线程Id) select connection_id(); 可以通过查看表...

    背景

    有一次同事使用 Navicat for MySQL 软件对某个表进行了 开启事物,导致我们一直查询不出数据。
    这种情况在平时项目也会出现 事物未提交的情况。
    那么问题来了,事物未提交导致锁等待如何解决?
    接下来分析定位及如何解决问题:

    查看当前连接Id(线程Id)

    select connection_id();


    可以通过查看表information_schema.innodb_lock,获取锁的状态

    select * from information_schema.innodb_locks;


    查看系统参数锁超时时间 innodb_lock_wait_timeout

    show variables like innodb_lock_wait_timeout;


    查看未提交的事务

    SELECT * from information_schema.INNODB_TRX


    获取事物的描述

    show engine innodb status\G

    主要看TRANSACTIONS 这部分


    如何解决未提交的事务

    1)如果能知道哪个用户在执行这个操作,让他提交一下(这种可能性很小)

    2)kill掉这个线程id号,让事务回滚

    show processlist;
    
    获取所有处理线程,找到相对应引起死锁的线程Id
    
    kill Id
    


    本文章来源:https://github.com/Zeb-D/my-review

    展开全文
  • oracle查看未提交事务

    千次阅读 2015-09-10 20:43:27
    select SQL_TEXT from v$sql,v$transaction where LAST_ACTIVE_TIME=START_DATE;
    select SQL_TEXT from v$sql,v$transaction where LAST_ACTIVE_TIME=START_DATE;
    展开全文
  • 查询后发现有几个事务已经执行了几个小时,一直没有提交,修改表结构的操作必须等待所有已经开启的事务提交后才能执行。 查看事务 select * from information_schema.INNODB_TRX\G; 查看线程 SELECT * FROM ...

    起因:下午同事在修改表结构时,发现修改语句被阻塞无法执行。

    查询后发现有几个事务已经执行了几个小时,一直没有提交,修改表结构的操作必须等待所有已经开启的事务提交后才能执行。

    • 查看事务
      select * from information_schema.INNODB_TRX\G;

    • 查看线程
      SELECT * FROM information_schema.processlist;

    只能找到这个未提交的事务的事务id和线程id,但都处于sleep状态,不好分析事务内容到底是什么,但是通过processList 里的IP定位到了对应的服务器和执行的脚本。
    当时先杀死了这些线程。

    重新运行脚本重现了当时的问题。

    • 查看锁等待
      SELECT * FROM information_schema.innodb_lock_waits;

    • 查看还未结束的执行sql
      select * from performance_schema.events_statements_current\G;
      通过这个方法找到了执行的查询语句。

    MySQL 的 SELECT,INSERT,UPDATE或DELETE都会开启事务。
    如果AUTOCOMMIT设置为1(默认值),每一个SQL语句都被认为是一个完整的事务。 AUTOCOMMIT设置为0时,在随后的一系列语句的作用就像一个事务,直到一个明确的COMMIT语句结束。

    脚本是python 写的,用的pymysql 操作数据库。pymysql 初始化连接时,默认 autocommit=False, 代码里也没有手动commit, 脚本本身是常驻进程,所以查询事务一直没有提交。

    将pymysql 的连接初始化的 autocommit 设为 True, 至此问题解决。

    参考链接:
    http://www.ywnds.com/?p=8841
    http://blog.csdn.net/zyz511919766/article/details/49335729

    展开全文
  • 未提交-Read uncommitted 读已提交-Read committed 可重复读-Repeatable read–MySQL 序列化-Serializable 事务隔离级别 脏读 不可重复读 幻读 读未提交 √ √ √ 读已提交 × √ √ 可重复读 × × ...
  • DAO` protected int[] batchExcute(final String sql, final List[]> args) { int[] temp=jdbcTemplate.batchUpdate(sql, new ...如以上处理报错,可以考虑将getConnection()赋给一个conn变量,后续使用conn操作
  • 4.查看未提交事务 SELECT * from information_schema.INNODB_TRX 5.获取事物的描述 show engine innodb status\G 主要看TRANSACTIONS 这部分 如何解决未提交事务 kill掉这个线程id号,让事务回滚 show...
  • DB2异常处理以及事务提交

    千次阅读 2015-07-16 17:39:08
    使用开发工具是toad for db2, ... --声明出错处理  declare exit handler for sqlexception  begin  set i_code=sqlcode;  set i_err_no=1;  insert into xtb_log values(v_proc_name,i_code);
  • 业务处理过程,发现了以下问题,代码一是原代码能正常执行,代码二是经过迭代一次非正常执行代码 代码一:以下代码开启线程后,代码正常执行 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, ...
  • Mybatis系列之设置自动提交事务

    千次阅读 2020-06-02 15:38:13
    Mybatis系列之设置自动提交事务 业务描述:最近遇到业务很复杂的方法,有通过Spring的@Transactional注解开启事务的,不过在ie11出现bug,console日志打印已经update成功的SQL,方法很长,执行成功后,发现数据没有...
  • 使用Python3脚本实现事务处理,同时执行多条Sql语句后提交事务,源码如下: import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='localhost', port=3310, user='user', passwd='123', db='...
  • MySQL数据库事务处理

    万次阅读 多人点赞 2017-03-16 15:43:33
    事务处理用于有效记录某机构感兴趣的业务活动(称为事务)的数据处理(例如销售、供货的定购或货币传输)。通常,联机事务处理 (OLTP) 系统执行大量的相对较小的事务。 事务处理是将多个操作或者命令一起执行,所有...
  • 分布式事务解决方案

    千次阅读 2018-10-12 19:35:33
    2.分布式事务场景 1. 跨库事务 2. 分库分表 3.服务化 3.两阶段提交 & 三阶段提交 & paxos CAP + BASE 4. 典型的柔性事务方案 5. 场景的分布式事务解决方案 1. 基于XA协议的两阶段提交 2. ...
  • 事务

    千次阅读 2019-03-23 17:13:47
    事务的三种类型 Java事务的类型有三种:JDBC事务、JTA(Java ...JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法: public ...
  • spring boot手动提交事务

    千次阅读 2019-11-16 16:11:25
    spring boot手动提交事务 import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction....
  • 个人理解的一个事物:是一个Connection一系列的操作...自动提交事务:每执行一条sql语句,就同步到数据库中。 2.手动提交事务:执行一系列的sql语句后一起同步到数据库中。事物的四大特性: A(atomic):原子性,事务
  • 事务处理sql语句

    千次阅读 2018-11-26 10:51:54
    一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个...二. 处理事务的流程 使用事务 //首先要关闭自动提交 conn...
  • mybatis自动提交事务管理

    千次阅读 2018-09-12 00:40:14
    关于mybatis的事务的回滚与提交的官方说明如下: 事务控制方法 控制事务作用域有四个方法。 当然, 如果你已经选择了自动提交或你正在使用外部事务管 理器,这就没有任何效果了。然而,如果你正在使用 JDBC 事务管理员,...
  • 事务处理

    千次阅读 2018-08-22 14:36:15
    Notes:SQL文件 事务处理(transaction processing) 为什么需要事务处理事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证...提交(commit)指将存储的SQL语句结果写入数据库。 保留点(s...
  • ssm手动提交事务

    千次阅读 2019-03-11 16:35:24
    不嫌麻烦,可以自己设置手动提交事务模式,具体说明如下: 1.配置文件 applicationContext.xml <bean id="transactionManager" class="org.springframework.jdbc.datasourc....
  • 解决mysql 事务未提交导致死锁报错: 当 sessionA 尝试修改 B 表数据,因为 sessionB 当前为锁定状态,而且 sessionB 对 B 表中数据具有锁定状态中,则出现死锁。sessionB 会自动终止尝试修改 A 表数据事务, 两个...
  • 业务处理过程,发现了以下问题,代码一是原代码能正常执行,代码二是经过迭代一次非正常执行代码 代码一:以下代码开启线程后,代码正常执行 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, Tim...
  • spring事务手动提交

    千次阅读 2019-04-28 09:52:48
    事务的过程如下:开始事务--------提交/回滚事务事务就是一系列执行的过程。 开始之后,就会执行过程,并且记住过程。这个时候,数据库中所用的表是被锁定了的。 所以说,如果你只开始了事务,没有进行commit...
  • 想要在Spring中提交事务成功后,调用一部分异步方法。 解决 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override public void afterCommit() { // ...
  • JDBC事务原理及Spring事务处理机制

    万次阅读 多人点赞 2018-07-17 19:54:43
    一、事务基本概念 1、事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像...
  • [EF]事务处理

    千次阅读 2019-06-14 13:50:13
    EF支持事务处理操作,以下语句会获取当前DbContext对象专用的DbContextTransaction()事务处理对象 DbContextTransaction transaction=context.Database.BeginTransaction(); 获取transaction之后,期间任何与...
  • 1.XA XA是由X/Open组织提出的分布式事务的规范。...XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁。XA之所以需要引入事
  • 在使用oracle数据库时,有时需要提交事务,有时不需要 DML语言,比如update,delete,insert等修改表中数据的需要commit; DDL语言,比如create,drop等改变表结构的,就不需要写commit(因为内部隐藏了commit);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 288,516
精华内容 115,406
关键字:

未提交的事务怎么处理