事务
数据库事务是指作为单个逻辑工作单元的一系列操作的集合。
事务的开始:DM8没有提供显示定义事务开始的语句,第一个可执行的SQL语句隐含事务的开始。
事务的结束:用户可以使用提交(COMMIT)或回滚(ROLLBACK)语句显式的结束一个事务,也可以使用隐式的方式结束一个事务。
显式的结束事务
创建测试表STUDENT
CREATE TABLE STUDENT(C1 INT, C2 VARCHAR(100));
select * from student;
插入数据,并使用commit语句显式的结束事务
insert into student values(1,'张三');
commit;
select * from student;
使用rollback也可以显式的结束事务
插入数据
insert into student values(2,'李四');
select * from student;
使用rollback显式的结束事务后之前插入的数据也会被回退
rollback;
select * from student;
隐式的事务结束:当连接的属性设置为自动提交时,每执行一条语句都会提交事务。事务所在的程序正常结束和用户退出;系统非正常终止时。
保存点(SAVEPOINT):事务在执行中可以部分回滚到某个由用户设置的保存点,在该保存点以前的操作有效,而以后的操作被回滚掉。
插入数据设置保存点
insert into student values(2,'李四');
savepoint a;
insert into student values(3,'王五');
savepoint b;
insert into student values(4,'赵六');
select * from student;
回滚到保存点a,可以发现保存点a之前插入的数据存在,而之后的数据都被回退掉了。
rollback to savepoint a;
select * from student;
此时我们再前进到保存点b,发现报错,因为我们之前回滚到保存点a时保存点b已经被回滚掉了。
可以从v$trx视图中查看事务记录信息
select * from v$trx;
可以将事务设置为只读事务,再该事务中只能读取表数据,不能修改。
SET TRANSACTION READ ONLY;
insert into student values(3,'王五');
在DM8中DDL语句会自动提交
CREATE TABLE STUDENT_INFO(C1 INT, C2 VARCHAR(100));
锁
锁的拥有者:事务。
锁的作用:配合多版本并发控制(MVCC),保护数据一致性,防止并发事务修改同一数据。
锁的生命周期:一般事务结束时释放锁。
在执行SELECT、INSERT、DELETE、UPDATE等DML语句时,隐式上意向锁。
阻塞和死锁是会与并发事务一起发生的两个事件,它们都与锁相关。当一个事务正在占用某个资源的锁,此时另一个事务正在请求这个资源上与第一个锁相冲突的锁类型时,就会发生阻塞。被阻塞的事务将一直挂起,直到持有锁的事务放弃锁定的资源为止。
在事务1中修改数据,且不提交
update student set c2='张三1' where c1=1;
在事务2中对相同数据进行修改,就发现会话在等待,因为事务1是锁的持有者,没有提示执行成功。
update student set c2='张三2' where c1=1;
当事务一commit提交之后,事务2中的更新语句就会执行成功,这就是阻塞。死锁与阻塞的不同之处在于死锁包括两个或者多个已阻塞事务,它们之间形成了等待环,每个都等待其他事务释放锁。
以上是笔者对DM8事务与锁的浅谈,欢迎点评。
更多资讯请上达梦技术社区了解:https://eco.dameng.com