达梦数据库-事务管理和接口编程

事务管理

事务的基本概念

        事务是指单个逻辑单元的一系列操作的合集, 一个事务只会属于一个会话
                显示事务: 达梦没有提供显示事务的开始语句, 因此第一个执行的语句就是开启一个事务
                隐式事务: 达梦没有提供显示事务的开始语句, 但是可以通过配置来结束一个隐式的事务
        隐式事务配置参数
                DDL_AUTO_COMMIT ={0|1}
                0: 表示不开启
                1: 表示开启DDL自动提交功能, 开启时, 如果DDL之前语句有DML操作则在该DDL之前的DML语句会自动提交, 没有DDL语句则不自动提交

事务的结束

COMMIT 将事务对数据库的操作提交, 所谓提交就是将数据持久化到磁盘
ROLLBACK 将事务对数据库的操作进行回滚, 回滚到事务没有开始时的状态

保存点

相当于对之前修改的数据进行了一次快照操作
事务在执行过程中可以通过常见保存点来对当前以及之前的操作进行快照的创建
用户在对事务进行回滚时, 可以回到之前设置保存点的任意一个保存点位置

基本语句

SQL> SAVEPOINT 保存点名称; – 创建一个保存点
SQL> ROLLBACK TO SAVEPOINT 保存点名称; – 回退到之前某个保存点

事务状态和ID

NOT_START 未启动 通过disql conn进行连接后, 查看v$trx视图, 就可以查到当前事务时该状态
ACTIVE 活动 对当前数据库正在进行操作的事务
LOCK_WAIT 锁等待 当对数据进行修改时, 无法对数据进行上锁到安置阻塞的事务
TRX4_PRE_COMMIT 预提交

事务ID: TRXID, 每个事务都对应一个唯一标识
事务在启动后有系统自动分配一个TRXID给事务, 当事务提交或回滚后, 该事务ID会被充值为0
事务再次启动时, 系统会自动再重新粉衣一个TRXID

事务分类

虚事务: 不属于任何会话, 始终驻留在任务系统中, 用于回滚段清理, 但这个事务在v$trx中查询不到
普通事务: 用户发起的事务都属于普通事务
活动事务: TRXID 大于 0 并且 状态为 ACTIVE 或 LOCK_WAIT
非活动事务: TRXID 等于 0 并且 状态为 NO_START
读写事务: 可以对数据进行读写操作
只读事务:只能访问数据, 不能修改数据

事务的隔离级别

    读未提交    READ UNCOMMITTED
    读提交      READ COMMITTED
    可重复读    REPEATABLE READ
    串行化      SERAIAL

各个隔离级别下产生的影响

        +----------+------+------------+------+
        | 隔离级别 | 脏读 | 不可重复读 | 幻读 |
        +----------+------+------------+------+
        | 读未提交 |  Y   |     Y      |  Y   |
        +----------+------+------------+------+
        | 读提交   |  N   |     Y      |  Y   |
        +----------+------+------------+------+
        | 可重复读 |  N   |     N      |  Y   |
        +----------+------+------------+------+
        | 串行化   |  N   |     N      |  N   |
        +----------+------+------------+------+

        脏读: 一个事务在提交之前, 其他事务可以看到该事务的操作, 称为脏读
        幻读: 一个事务按照相同的条件查询, 却发现其他事务插入了满足其查询条件的新数据, 成为幻读
        不可重复读: 一个事务先后读取同一条记录, 但是两次读取的数据不同, 称为不可重复读

达梦支持三种事务隔离级别

读未提交
读提交 默认隔离级别
串行化

会话级别设置隔离级别

SQL> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

锁的概念

        锁的作用: 配合多版本并发(MVCC), 保护数据一致性, 防止多个事务修改同一数据
        锁的拥有者: 事务
        锁的生命周期: 事务提交或回滚时释放锁

锁模式

        共享锁 S 该模式下, 允许并发事务同时读取相同的资源,但不能修改
        排他锁 X 该模式下, 用于DML操作, 当某个事务修改某个数据时, 其他事务不能对该数据进行修改操作, 防止并发用户同时修改相同的数据造成数据不一致或者不正确

意向锁

意向共享锁 IS   当用户去读表中记录时, 首先要加意向共享锁
意向排它锁 IX   当用户去写表中记录时, 首先要加意向排它锁

锁的类型

事务锁

        以事务号为封锁对象, 系统为每个活动事务生成一把TID锁
        代替了其他数据库行锁的功能, 防止多个事务同时修改同一行数据
        每个事务启动时创建一个独占的TID锁, 锁模式为X模式并持有到事务结束
        达梦为每行记录创建一个隐含的TID字段实现行级多版本, 用于判断事务可见性

对象锁

通过统一的对象ID进行封锁, 对数据字段的封锁和表锁合并为对象锁

字典锁

防止在进行DML操作时, 访问对象的定义被修改

锁等待

一个事务正在占用某个资源的锁, 此时另一个事务正在请求这个资源上与第一个事务锁相冲突的锁类型此时就发生了锁等待或者说阻塞
该事务会一致被挂起, 直到第一个事务释放锁后

死锁检测

死锁指两个或多个事务同时访问某个资源造成了等待环, 每个事务都等待其他事务释放锁

多版本并发控制

主要用于数据可见性的判断, 找到对当前事务可见的特定版本数据
对数据的每次更新形成数据的新版本, 老版本保存在回滚段中
读操作将不需要上锁, 读写操作不会相互阻塞, 并发度大幅度提高

物理记录结构

    +-----------------------+--------------------------+---------------------------------+
    |      NREC 头部        |       NREC 数据区        |             NREC尾部            |
    +--------+--------------+--------------------------+----------+-----------+----------+
    | LEN(2) | 字段控制标识 | 按字段顺序存储的实际数据 | ROWID(6) | ROLPTR(7) | TRXID(6) |
    +--------+--------------+--------------------------+----------+-----------+----------+

一条记录的隐藏列

TRXID DM 每行记录上都有隐含字段, TRXID , ROWID , TRXID: 表示最近操作该行数据的事务号, 同时使用TRXID实现MVCC机制和事务可见性判断
ROLLPTR 回滚记录指针, 指向本记录的上一个版本

活动事务视图

        当事务启动时会收集活动事务的TRXID, 构造一个活动事务视图, 主要用于判断事务启动中该条记录是否可见(可见性判断)
主要字段为: TRXID, NEXT_TRXID, MIN_TRXID

在读未提交级别下所有事务都是可见的

其他隔离级别下

当物理TRXID 小于 当前事务活动视图中的MIN_TRXID时 则 该物理记录可见
当物理TRXID 等于 当时事务ID, 则说本事务修改的当前记录则物理机理可见
当物理TRXID 大于 当前事务活动视图中的NEXT_TRXID 则 该物理机理不可见
当物理TRXID 包含事务活动视图中 则 该物理记录不可见

相关动态视图

    V$SESSIONS          会话信息
    V$TRX               活动事务信息
    V$TRXWAIT           事务等待信息
    V$LOCK              锁信息
    V$DEADLOCK_HISTORY  死锁信息

ODBC 接口编程

        开放数据库连接, 为解决异构数据库间的数据共享而产生的, ODBC 为异构数据库访问提供统一接口, 允许应用程序以SQL 为数据存取标准, 存取不同DBMS管理的数据
        使应用程序直接操纵DB中的数据, 免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件
        DM ODBC 3.0 遵照 Microsoft ODBC 3.0 规范设计与开发, 实现了 ODBC 应用程序与 DM 数据库的互连接口
用户可以直接调 DM ODBC 3.0 接口函数访问 DM, 也可以使用可视化编程工具如 C++ Builder、PowerBuilder 等利用 DM ODBC 3.0 访问 DM 数据库

ODBC接口访问达梦数据库示例

1、安装UNIXODBC
yum -y install unixODBC unixODBC-devel

2、配置DM数据源
[root@itsdata ~]# vi /etc/odbcinst.ini
[DM8]
Description = DM8 ODBC
Driver = /dm8/bin

3、配置连接参数
[root@itsdata ~]# vi /etc/odbc.ini
[DM]
DRIVER = DM8 ODBC
SERVER = 100.63.1.7
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236

4、示例代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <sql.h>
    #include <sqltypes.h>
    #include <sqlext.h>
    
    #define RC_SUCCESSFUL(rc) ((rc) == SQL_SUCCESS || (rc) == SQL_SUCCESS_WITH_INFO)    /* 检测返回代码是否为成功标志,当为成功标志返回 TRUE,否则返回 FALSE */
    #define RC_NOTSUCCESSFUL(rc) (!(RC_SUCCESSFUL(rc)))                                 /* 检测返回代码是否为失败标志,当为失败标志返回 TRUE,否则返回 FALSE */

    HENV henv;          /* 环境句柄 */
    HDBC hdbc;          /* 连接句柄 */
    HSTMT hsmt;         /* 语句句柄 */
    SQLRETURN sret;     /* 返回代码 */

    int main(void)
    {
        SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);    /* 申请一个环境句柄 */
        SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);    /* 设置环境句柄的 ODBC 版本 */
        SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);    /* 申请一个连接句柄 */

        sret = SQLConnect(hdbc, (SQLCHAR *)"DM", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS, (SQLCHAR *)"SYSDBA", SQL_NTS);

        if (RC_NOTSUCCESSFUL(sret)) {
            /* 连接数据源失败! */
            printf("odbc: fail to connect to server!\n");
            SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            SQLFreeHandle(SQL_HANDLE_ENV, henv);
            exit(0);
        }
        printf("odbc: connect to server success!\n");

        SQLDisconnect(hdbc);                    /* 断开与数据源之间的连接 */
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);    /* 释放连接句柄 */
        SQLFreeHandle(SQL_HANDLE_ENV, henv);    /* 释放环境句柄 */
        return 0;
    }

JDBC 接口编程

        JDBC (Java Database Connectivity) 是 Java 应用程序与数据库的接口规范,旨在让各数据库开发商为 Java 程序员提供标准的数据库应用程序编程接口 (API)
        JDBC 定义了一个跨数据库、跨平台的通用 SQL 数据库 API。
DM JDBC 数据库驱动程序是一个能够支持基本 SQL 功能的通用应用程序编程接口,
支持一般的 SQL 数据库访问。通过 JDBC 驱动程序,用户可以在应用程序中实现对 DM 数据库的连接与访问,

JDBC 驱动程序的主要功能包括:
        建立与 DM 数据库的连接。
        转接发送 SQL 语句到数据库。
        处理并返回语句执行结果。

JDBC 连接池

        数据库连接池负责分配、管理和释放数据库连接。它允许应用程序重复使用一个现有的数据库连接,
而不是再重新建立一个;对空闲时间超过最大空闲时间的数据库连接能自动释放,
避免因数据库连接未释放而引起的连接泄露问题

JDBC常见连接池

1、C3P0:是一个开放源代码的JDBC连接池,实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
2、Proxool:是一个Java SQL Driver驱动程序,提供了对选择的其它类型的驱动程序的连接池封装。可以透明地为现存的JDBC驱动程序增加连接池功能。
3、Jakarta DBCP:DBCP是一个依赖Jakartacommons-pool对象池机制的数据库连接池。DBCP可以直接在应用程序中使用。
4、BoneCP:是一个快速、开源的数据库连接池。帮用户管理数据连接,让应用程序能更快速地访问数据库。比C3P0/DBCP连接池速度快25倍。
5、Druid:Druid不仅是一个数据库连接池,还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。
6、Hikari:Hikari是一款非常强大,高效,并且号称“史上最快连接池”。在springboot2.0之后,采用的默认数据库连接池就是Hikari。

JDBC连接基础参数

jdbc.driver=dm.jdbc.driver.DmDriver
jdbc.url=jdbc:dm://localhost:5236
jdbc.username=test
jdbc.password=Test12345

​详细内容请参考官方文档:​​https://eco.dameng.com​​

更多详情请访问达梦在线服务平台 https://eco.dameng.com/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值