注册
事务与锁
技术分享/ 文章详情 /

事务与锁

Solreal 2025/12/31 85 0 0

一、DM数据库的事务
1、什么是事务?特征
(1)是由一组DML(Data Manipulation Language,数据操作语言–insert update delete)语句组成
(2)要么都执行成功,要么都执行不成功 —> 原子性
(3)只要事务操作被成功写入重做日志,就算事务提交数据
(4)特征:A(原子性) C(一致性) I(隔离性) D(持久性)
2、控制事务:达梦与Oracle一样都是自动开启事务,事务的起始标志定义为事务中的第一条DML。

SQL> show autocommit AUTOCOMMIT OFF

银行转账

update emp set sal=sal-100 where ename='KING'; update emp set sal=sal+100 where ename='JONES'; commit;

3、事务的并发
(1)事务的隔离级别
(2)脏读、不可重复读、只读、可序列化读
脏读:在事务B中读取到了事务A没有提交的数据
不可重复读:在同一个事务中,前后两次读取的数据不一致
幻读:在事务B中,读取到了事务A新插入的数据

create table useraccount(tid number,tname varchar2(10),money number); insert into useraccount values(1,'Tom',1000); insert into useraccount values(2,'Mike',1000); commit;

(3)Demo:脏读

set transaction isolation level read uncommitted;

(4)Demo:不可重复读

(5)Demo:事务的只读

set transaction read only;

(6)串行化(SERIALIZABLE)
最严格的隔离级别,数据库中的数据最安全,性能最差
当成是一个单线程的工作模式

set transaction isolation level serializable;

二、DM数据库的锁
1、锁的模式
2、锁的粒度
3、监控DM数据库的锁

SQL> desc v$lock 行号 NAME TYPE$ NULLABLE ---------- -------- ----------- -------- 1 ADDR BIGINT Y 锁的内存地址 2 TRX_ID BIGINT Y 锁所属于的事务ID 3 LTYPE VARCHAR(10) Y 锁的类型:对象锁(Object)、TID(TID行锁) 4 LMODE CHAR(2) Y 锁的模式:共享锁S,排它锁X、意向共享锁IS、意向排它锁IX 5 BLOCKED INTEGER Y 表示锁是否属于上锁等待的状态 6 TABLE_ID INTEGER Y 锁所对应的表的ID 7 ROW_IDX BIGINT Y 行的信息 8 TID BIGINT Y 事务ID 9 IGN_FLAG INTEGER Y 10 HLCK_EP INTEGER Y

查询员工表emp的ID:sysobjects

select id,name from sysobjects where name='EMP'; SQL> select id,name from sysobjects where name='EMP'; 行号 ID NAME ---------- ----------- ---- 1 1098 EMP

会话1:

update emp set sal=sal+100 where empno=7839;

会话2:

update emp set sal=sal+100 where empno=7839;

监控锁

select LTYPE,LMODE,BLOCKED,ROW_IDX from v$lock where TABLE_ID=1098;

4、死锁
时刻1:
会话1:

update emp set sal=sal+100 where empno=7839;

会话2:

update emp set sal=sal+100 where empno=7566;

时刻2:
会话1:

update emp set sal=sal+100 where empno=7566;

会话2:

update emp set sal=sal+100 where empno=7839;

5、手动加锁
使用dbms_lock程序包实现秒杀

grant execute on dbms_lock to scott; conn scott/Welcome_1 create table testlock(clientID number); create or replace procedure insert_new_row (clientID in number,lock_id in number) as -- 定义变量,代表是否成功申请到锁 flag number; begin -- 申请得到锁 flag := dbms_lock.request(id => lock_id,timeout=>0); if flag = 0 then -- 执行秒杀 insert into testlock values(clientID); -- 睡眠2秒钟 dbms_lock.sleep(2); end if; -- 释放锁 dbms_lock.release(lock_id); end; /
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服