关于DML命令与DDL命令引发的对事物特性的思考

来源:互联网 发布:话剧 知乎 编辑:程序博客网 时间:2024/05/17 00:18

截图太多,不一一上传了

测试一:

查询表T1

 

向其中插入一条数据:

 

显示成功了

现在对T1增加一列:

 

竟然也成功了!

打开另一个窗口查询表T1

 

发现表T1插入了新的数据且增加了新列!

测试二:

在窗口一向表T1插入一行数据

 

显示成功

在窗口二增加一列:

 

执行不了啊!(等待状态)

重新用窗口一查询表T1

 

发现插入的内容有,增加的列没有

打开窗口三查询表T1

 

发现插入的数据了增加的列都没有!!!

继续来测试:

向窗口一中输入提交命令:

 

几乎是在同时发现窗口二的变化:

 

查询T1表:

 

数据插入成功,增加列成功。

 

通过测试证明了什么?

 

1、DDL的命令前后都有COMMIT。同窗口下执行完DML命令不提交,事务没有结束,会继续向下执行DDL命令。(事务的一致性)

2、相同用户跨窗口(事务)的COMMIT不会生效,这也就意味着如果表中有任何正在活动的DML命令,truncateDDL)就会失败,事务中断DDL命令,直到使用commitrollback终止DML命令为止。但是前提是跨窗口!(原子性:事务的原子性是指,事务中程序是数据库的逻辑工作单位,它对数据的修改要么全部执行,要么完全不执行.原子也意味着不可分割,不管有多少程序,只要在同一个事务中,那么它们就是一个整体,如果都执行成功才意味着该事务成功,而有一个操作失败,那么同一个事务中的其他操作即使执行成功也没有用,事务会使其全部撤销.

3、相同用户的两个SQL窗口,一个窗口的提交会影响另一个窗口,也就是说变更是即时的。

(用oracle事务特性来解释,事务的分离性:分离性是指并发事务之间不能相互的干扰.也就是说,一个事务操作的数据不会被其他事务看到和操作.

现在再来看一下我今天技术分享时说的那句话:如果表中有任何正在活动的DML命令,truncateDDL)就会失败,事务中断DDL命令,直到使用commitrollback终止DML命令为止。不能说说错了,但是肯定也不能算对,因为少了一个前提!

 

(另外一个特性:持久性:持久性是指一旦事务提交完成,那么这将是对数据永久的修改,即使被修改的数据遭到破坏,也不会出现回到修改之前的情况.

 

 

思考:问了一下同事,他说PG都是自动提交的,我想了一下,大学里学的MySQL貌似也是自动提交。那么oracle数据库SQL语句中能不能像PGMySQL一样自动提交呢?

查了一些资料,发现貌似可以。下面测试一下:

先查询一下状态:

 

发现自动提交的选项是关闭状态的,符合以上做的测试。

那么我打开自动提交试一试:

 

已经打开了!

测试一下:

 

插入后直接提示我已经提交

打开另一个窗口测试一下:

 

提示我删除列成功

在该窗口和其他窗口查询表T1皆是已删除:

 

证明成功!

 

最后,我还是吧自动提交关上吧

 

 


唉!???怎么不同窗口状态不一样啊??

前面说了,事务具有分离性,自动提交只是这个本事务的,另一个事务肯定是关闭状态。

另外自动提交还可以限制次数:Set autocommit XX   自动提交xx次之后变为非自动提交状态。一般来说是建议将自动提交设置为关闭状态的。

 

 

 

 

0 0
原创粉丝点击