事务的隔离级别(多个事务并发后可能出现哪些问题,设置何种数据库隔离级别解决)

事务指的是一条sql语句,或者一些sql语句。
事务有原子性,数据库系统在执行一个事务时,要么全部成功,要么全部失败。
事务有一致性,数据库系统在执行一个事务后,表与之前的表数据应该是符合定义的约束条件的。
事务有持久性,数据库系统执行一个事务成功提交后,即便服务器异常关机,开机后应该数据也保存在表中了,程序员不需要担心。
事务有隔离性,数据库系统在执行多个事务时,并发执行导致不一致现象。
一般来说,会有以下四种问题:
假设有一个银行数据库,有表用户存款表user_money(id,name,money)
有两个用户 (化名)
1 王梦 50000
2 宫宇 0

1 写写错误(更新丢失问题)
事务t1和事务t2写同一记录,导致一个事务t1没有被保存下来。

事务t1:王梦存款取出5000用于培训费。
step1:读王梦存款到缓冲区 x;step2:x - 5000=y;step3:写回 y 到磁盘
事务t2:王梦存款增加10000工资。
step1:读王梦存款到缓冲区 z;step2:z + 10000= p;step3:写回 p 到磁盘

并发执行顺序:
t1.step1 读王梦存款到缓冲区 5wan
t2.step1 读王梦存款到缓冲区 5wan
t1.step2
t1.step3
t2.step2
t2.step3 写回 6wan 到磁盘

这个使用排它锁解决,t1写,上一个排它锁,t2只能在t1执行完成提交或回滚后执行。

2 写读错误(脏读问题)
事务t1写一个记录,之后回滚操作,事务t2读取回滚前的数据,实际上这个数据是运算过程中的,不是最终的预期数据。

事务t1:宫宇存款增加50wan
step1:读宫宇存款到缓冲区;step2:加50wan;step3:结果从缓冲区写回磁盘;step4:回滚
事务t2:读取宫宇存款1次
step1:读宫宇存款到缓冲区;

并发执行顺序:
t1.step1
t1.step2
t1.step3
t2.step1
t1.step4

这个使用提交读解决,t2只能在t1提交事务之后读记录。

3 读写错误(不可重复读问题)
事务t1,读取一个记录,接着事务t2修改这个记录并且提交,接着事务t1在此读取这个记录。两次读取数据不用。

这个本身没有问题,虽然事务t1读取两次数据不同,但是这两次数据确实是一致性的,满足实际情况的。所以oracle数据库的隔离级别设置的就是提交读级别。

如果希望两次读取是一个结果,那么使用可重复读解决,即事务t1在两次读取之间,不允许事务t2修改记录提交。

4 读删除插入错误(幻读)
为了记忆方便,我将它记作 读 - 删除、插入错误。
事务t1,读取满足条件的记录总数,事务t2在删除一个满足条件的记录并保存了,事务t1再次读取满足条件的记录总数,发现少一条。

这个本身也没有问题。mysql数据库使用的隔离级别就是可重复读级别。两次的数据取后面的就是最新的。

如果要求这个也不出现,使用可串行化解决,即多个事务并发的结果与这些事务按照一个串行顺序执行的结果一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值