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

OceanBase Cloud快速入门第82期:如何开启事务?

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/


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

开启事务

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

  • 执行 BEGIN 命令

    obclient [test]> BEGIN;      //开启事务
    obclient [test]> INSERT INTO table1 VALUES(1,1);  
    obclient [test]> COMMIT;
    
  • 执行 START TRANSACTION 命令

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

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

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

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

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

obclient [test]> CREATE TABLE ordr(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL,
value INT,
gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP );
Query OK, 0 rows affected

obclient [test]>  INSERT INTO ordr(id, name, value)
VALUES (1,'CN',10001),(2,'US', 10002),(3,'EN', 10003);
Query OK, 3 rows affected
 Records: 3  Duplicates: 0  Warnings: 0

obclient [test]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-10-19 14:51:12 |
|  2 | US   | 10002 | 2022-10-19 14:51:12 |
|  3 | EN   | 10003 | 2022-10-19 14:51:12 |
+----+------+-------+---------------------+
2 rows in set

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

obclient [test]> UPDATE ordr SET id=4 WHERE name='US';
Query OK, 1 row affected 
Rows matched: 1  Changed: 1  Warnings: 0

执行成功后,可以使用 oceanbase.V$OB_TRANSACTION_PARTICIPANTS 查询事务的状态。

obclient [test]> SELECT * FROM oceanbase.V$OB_TRANSACTION_PARTICIPANTS;
*************************** 1. row ***************************
       TENANT_ID: 1002
          SVR_IP: xx.xx.xx.223
        SVR_PORT: 2882
      SESSION_ID: 3221487660
  SCHEDULER_ADDR: "xx.xx.xx.223:2882"
         TX_TYPE: UNDECIDED
           TX_ID: 110352
           LS_ID: 1001
    PARTICIPANTS: NULL
 CTX_CREATE_TIME: 2022-10-19 14:55:23.763474
 TX_EXPIRED_TIME: 2022-10-19 14:55:23.763474
           STATE: ACTIVE
          ACTION: START
PENDING_LOG_SIZE: 116
FLUSHED_LOG_SIZE: 0
            ROLE: LEADER
1 row in set



欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

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

评论