截图太多,不一一上传了
测试一:
查询表T1:
向其中插入一条数据:
显示成功了
现在对T1表增加一列:
竟然也成功了!
打开另一个窗口查询表T1:
发现表T1插入了新的数据且增加了新列!
测试二:
在窗口一向表T1插入一行数据
显示成功
在窗口二增加一列:
执行不了啊!(等待状态)
重新用窗口一查询表T1:
发现插入的内容有,增加的列没有
打开窗口三查询表T1:
发现插入的数据了增加的列都没有!!!
继续来测试:
向窗口一中输入提交命令:
几乎是在同时发现窗口二的变化:
查询T1表:
数据插入成功,增加列成功。
通过测试证明了什么?
1、DDL的命令前后都有COMMIT。同窗口下执行完DML命令不提交,事务没有结束,会继续向下执行DDL命令。(事务的一致性)
2、相同用户跨窗口(事务)的COMMIT不会生效,这也就意味着如果表中有任何正在活动的DML命令,truncate(DDL)就会失败,事务中断DDL命令,直到使用commit或rollback终止DML命令为止。但是前提是跨窗口!(原子性:事务的原子性是指,事务中程序是数据库的逻辑工作单位,它对数据的修改要么全部执行,要么完全不执行.原子也意味着不可分割,不管有多少程序,只要在同一个事务中,那么它们就是一个整体,如果都执行成功才意味着该事务成功,而有一个操作失败,那么同一个事务中的其他操作即使执行成功也没有用,事务会使其全部撤销.)
3、相同用户的两个SQL窗口,一个窗口的提交会影响另一个窗口,也就是说变更是即时的。
(用oracle事务特性来解释,事务的分离性:分离性是指并发事务之间不能相互的干扰.也就是说,一个事务操作的数据不会被其他事务看到和操作.)
现在再来看一下我今天技术分享时说的那句话:如果表中有任何正在活动的DML命令,truncate(DDL)就会失败,事务中断DDL命令,直到使用commit或rollback终止DML命令为止。不能说说错了,但是肯定也不能算对,因为少了一个前提!
(另外一个特性:持久性:持久性是指一旦事务提交完成,那么这将是对数据永久的修改,即使被修改的数据遭到破坏,也不会出现回到修改之前的情况.)
思考:问了一下同事,他说PG都是自动提交的,我想了一下,大学里学的MySQL貌似也是自动提交。那么oracle数据库SQL语句中能不能像PG和MySQL一样自动提交呢?
查了一些资料,发现貌似可以。下面测试一下:
先查询一下状态:
发现自动提交的选项是关闭状态的,符合以上做的测试。
那么我打开自动提交试一试:
已经打开了!
测试一下:
插入后直接提示我已经提交
打开另一个窗口测试一下:
提示我删除列成功
在该窗口和其他窗口查询表T1皆是已删除:
证明成功!
最后,我还是吧自动提交关上吧
唉!???怎么不同窗口状态不一样啊??
前面说了,事务具有分离性,自动提交只是这个本事务的,另一个事务肯定是关闭状态。
另外自动提交还可以限制次数:Set autocommit XX 自动提交xx次之后变为非自动提交状态。一般来说是建议将自动提交设置为关闭状态的。