数据库事务隔离级别使用经验

最近做项目会有多个线程同步更新数据库某一条记录中的某些字段,我在jvm层已经用同步锁控制了,可是项目是多机环境,依然会有这种情况。
处理这种情况第一反应是用数据库事务中的隔离级别,至于隔离级别是什么这里就不解释了,网上资料一大堆。
我的方法的逻辑是先查找某一条记录,然后在更改记录中的字段,然后在保存到数据库中。我用Oracle数据库。Oracle默认的隔离级别是读已提交,就是读取的数据肯定是别人已经提交了的,不存在读取更改中的数据,也就是不会发生脏读。
我第一次想着将隔离级别设置为***不可重复读***,因为不可重复读的意思是,在一个事务里面两次读取的数据应该是相同的,也就是在读取的时候应该会给读取行的数据加锁,这样更改这个数据的事务就会处理等待状态,可结果是直接报错了,因为Oracle只支持 读已提交和串行化,不过后来我想***不可重复读***也不能解决我的问题,依然会有同步情况。因为不可重复读是读写加锁,可是 读读不加锁。
最后没有办法只能将隔离级别设置为串行化,可我在测试的时候,我一个事务将隔离级别设置为串行化,执行到一半,还没有提交,这是另一个事务去更改我的正在更改的数据,我发现竟然可以提交成功,按理说这个时候应该是等待的。网上查了好些资料,说的是Oracle中串行化的实现是通过乐观锁实现的,也就是一个串行化的事务,另一个事务依然可以更改提交数据,这时串行化事务在提交的时候会报错,提示无法继续当前事务。这样的好处是不会产生阻塞,而MySQL 串行化就会产生阻塞。一个事务设置隔离级别为串行化的时候,如果有另一个事务要更新相同的数据在提交的时候会一直等待。
这些只是以前都不知道,这次知道了记录一下。
另外还把read-only 看了一下。因为隔离界别一共有四种,读未提交,读已提交,可重复读,串行化。并没有readonly,但是spring中的@Transaction可以设置为true,标识当前事务是一个只读事务,这个其实并没有实际的作用,只是告知数据库这是一个只读事务,数据库可以做相应的优化。但是在Oracle中 readonly 是串行化的一个子隔离级别,用处是在当前事务里面每次读到的数据肯定都是一样的,即使中途有其余事务提交了数据,在readonly中下次获取的数据依然是前面的一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值