暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

开启事务

SQL新手 2022-12-08
322

本文介绍 OceanBase 数据库常用的开启事务 SQL 语句及示例。

语句语法格式

OceanBase 数据库的事务控制语句与 MySQL 数据库兼容,开启事务可以通过以下方式来完成。

以 OceanBase 数据库 MySQL 模式为例,数据库在执行以下语句时会开启一个事务。

  • 执行 BEGIN 命令。

    BEGIN;      //开启事务
    INSERT INTO table1 VALUES(1,1);  
    COMMIT;
    
  • 执行 START TRANSACTION 命令。

    START TRANSACTION; //开启事务
    INSERT INTO table1 VALUES(1,1);  
    COMMIT;
    
  • 配置 autocommit = 0 时(关闭自动提交),INSERTUPDATEDELETESELECT FOR UPDATE 系统会默认开启一个新事务。

    SET AUTOCOMMIT=0;
    INSERT INTO table1 VALUES(1,1);  //开启事务
    COMMIT;
    
    SET AUTOCOMMIT=0;
    UPDATE table1 SET id = 2 WHERE id = 1;  //开启事务
    COMMIT;
    
    SET AUTOCOMMIT=0;
    DELETE FROM table1 WHERE id = 2;  //开启事务
    COMMIT;
    
    SET AUTOCOMMIT=0;
    SELECT id FROM table1 WHERE id = 1 FOR UPDATE;  //开启事务
    COMMIT;
    

当事务开启时,OceanBase 数据库为事务分配一个事务 ID,用于唯一的标识一个事务。

在实际使用中,多个并发的连接下,对同一个数据表进行操作时,可能会出现两个事务对同一行数据进行操作。对于查询的读操作,可以通过 SELECT FOR UPDATE 语句锁定查询结果,避免其他 DML 语句对该笔记录进行同时修改。语句的详细使用方法,请参见 锁定查询结果 SELECT FOR UPDATE

示例:开启一个事务

以下示例中,先通过 SET autocommit=0 关闭自动提交功能,再通过 UPDATE 语句开启了一个事务。

obclient> SET autocommit=0;
Query OK, 0 rows affected 

obclient> UPDATE t SET c="b" WHERE i=1;
Query OK, 1 row affected 
Rows matched: 1  Changed: 1  Warnings: 0

可以使用 oceanbase.__all_virtual_trans_stat 查询事务的状态。

obclient> SELECT trans_id FROM oceanbase.__all_virtual_trans_stat;
+-----------------------------------------------------------------------------------------+
| trans_id                                                                                |
+-----------------------------------------------------------------------------------------+
| {hash:1724204239025989****, inc:9****, addr:"100.88.*.*:24974", t:163263662353****} |
+-----------------------------------------------------------------------------------------+
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论