您的位置:首页 > 数据库

数据库的事务JDBC

2011-08-23 07:49 344 查看

数据库的事务 JDBC

TRANSACTION_NONE:

正式地讲,TRANSACTION_NONE不是一个有效的事务级别。

根据java.sql Connection API文件,这个级别表示事务是

不被支持的,因此理论上说你不能使用TRANSACTION_NONE作

为一个自变量赋给Connection.setTransactionIsolation()

方法。事实上,虽然一些数据库实施了这个事务级别,但是

Oracle9i却没有实施。

脏读取(TRANSACTION_READ_UNCOMMITTE):

(允许的操作 读-读 读-写 写-读 (脏数据,不可重复读,虚读) )

表示,这个事务级别

允许读取脏数据,什么是脏数据?就是指还没有提交的数据.

因为这个级别,是允许一个事务(A)读取另一个事务(B)

还没有提交的数据.一旦事务B发生异常退出.而修改了的数据

却还没提交,或者新插入的数据和删除了的数据都还没有

提交,导致事务A拿到了一些脏数据,或者错误数据;

因此在这个事务级别里是会发生脏读,重复读,错误读取;

禁止脏读(TRANSACTION_READ_COMMITTED):

(允许的操作 读-读 读-写 (不可重复读,虚读))

在这个级别中,事务A

只能读取一些提交的数据,如事务B添加了一条记录,但是

如果事务B没有提交,那么事务A是读不到的,所以该事务级别,

把脏读给屏蔽掉了.---却允许重复读取,和错误读取.

什么是重复读取呢?譬如,事务A读取了一个数据,这个数据

的值为"helloworld",事务A准备利用这个数据来更新一下

其他数据,但这个时候事务B开始对这个数据进行修改,并且

提交---"hello 无名氏",由于是已经提交了,所以事务A是可以

看到这个数据的,当事务A在没提交事务之前,它想看下数据

是否正确,这个时候它发现,新读出的数据已经和原来的数据

不一样了(这就是重复读取);

允许重复读取(TRANSACTION_REPEATABLE_READ):

(允许的操作 读-读 读-写(仅允许插入,不允许删除和修改)(虚读))

在这个级别中,

是禁止了脏读,和取消了不可重复读取,但是没有禁止错误读取;

这个级别的事务比较严格,当一个事务A在读取一个值的时候

是不允许另一个事务对该值进行修改的;

为了允许重复读取,可以选用该级别,因为TRANSACTION_READ_

COMMITED这个事务级别,是允许重复读取提交的数据的,如果

事务A在读取一个数值的时候,值为"Hello World!",但这个时

候事务B对"Hello World"值进行修改了,改为"Hello EveryOne"

然后提交,当事务A再次去读取这个值的时候,去发现原来读到

的值改变了,变成了"Hello EveryOne",为了防止出现这种情况

可以禁止重复提交,目的是为了重复读取不会出错!那么这个

时候就可以选择

TRANSACTION_REPEATABLE_READ这个级别,

这个级别就是用来禁止重复提交的.

(实际上是加了行锁,锁定了选中的数据,不允许修改,但是允许插入新的数据)

虽然这个时候是禁止了重复提交,但却可以添加删除,

比如事务A,作了个查询语句"select * from 无名氏 "; 这个时候是允许事务B做这样的操作的:

"insert into 无名氏 values(2,'aaa')"; 这个时候,

事务A再次做读取操作的时候,却发现数据莫名其妙的

多了一条,这就是所谓的---幻影读取;

禁止幻读(TRANSACTION_SERIALIZABLE):

事务的最高级别(串行化 操作)事务级别最高,所耗费的性能也越多.

禁止幻读禁止了脏读,禁止了重复提交和幻读.

也就是当事务A在按条件查询的时候,事务A一旦没有提

交,任何事务都不能对事务A的资源进行操作--- 保证

事务A的操作真正的原子性!

注意:在Oracle中只支持两种级别:

TRANSACTION_READ_COMMITTED(默认的级别)(只有提交后

才可以读取)而每一个终端进行自己的DML操作 都自动开启了一个事务

TRANSACTION_SERIALIZABLE(窜行化操作)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: