利用数据库事务解决数据安全问题

本文讲述了数据库事务的原子性、一致性、隔离性和持久性,以及在多线程项目开发中如何确保数据一致性,包括并发问题如幻读、脏读、非重复读和丢失修改。介绍了不同隔离级别及其应用,并提到了乐观锁和唯一索引/主键在解决这些问题中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目开发中要保证数据得一致性,完整性,正确性,数据库事务得使用是必不可少了,想要用好,需要对数据库事务有一个比较深刻得了解;

接下来详细地了解一下事务的四大特性ACID:

原子性(Atomicity):事务中的所有操作是一个不可分割的工作单位,要么全部执行成功,要么全部执行失败

一致性(Consistency):数据库从一个一致性的状态变成另一个一致性的状态,理解为事务开始前是一个状态,事务结束后是一个状态

隔离性(Isolation):并发事务同时操作数据库,一个事务的执行不会被其他事务干扰,但是事务之间的数据还是可能被影响的,影响程度取决于事务的隔离级别

持久性(Durability): 一旦事务提交,不管发生什么(崩溃或者出错),数据要保存在数据库中

实践中利用事务解决问题:

单线程中,事务的原子性,一致性,持久性基本能保证数据的一致性,完整性,正确性,但是实际项目中,程序都是并行执行的,也就意味着事务是并行执行的,事务并行执行时,也可能会出现一些问题,也是现实工作中需要关注的问题,例如数据的幻读,脏读,非重复读,丢失修改等问题

幻读:幻读的重点在于新增或者删除,事务T1由于事务T2新增或者删除,第一次和第二次读出来的记录数不一样

脏读:

事务T1对数据进行修改,但是还没有提交时,事务T2读取数据进行修改,此时T2读取的是T1修改了的值。但是突然由于某种原因T1进行了回滚,这时候数据恢复了原来的值,而T2取得的数据依然是T1修改的值,这就导致了数据库中的值与事务获取的值不同的现象。也就是读到了不正确的值,这就叫脏读。

非重复读:

  是指在一个事务内,多次读取同一数据。在这个事务还没结束时,另外一个事务也访问该同一数据,并对该数据进行了修改。此时第一个事务再去读此数据时读到的结果与之前的结果不同。这就导致了在一个事务内两次相同的查询读到的数据是不一样的,因此称为是不可重复读

丢失修改:

两个事务T1和T2读入同一个数据并修改,T2提交的结果覆盖了T1提交的结果,导致T1的修改被丢失

为避免以上问题,数据库定义了事务的4种隔离级别,接下来将介绍隔离级别

未提交:T1事务能读取到T2事务中未提交的事务,如果T2事务回滚,T1事务读取到脏数据

已提交:T1事务能读取到T2事务中已提交的事务,T1多次读取时,可能读取得结果不一样,发生不可重复度

可重复读:这也是mysql数据库InnoDB引擎默认隔离级别,可以防止脏数据和非重复读得情况,但是没法防止幻读

可串行化:数据库执行事务串行执行,效率非常低,用的概率也比较少,基本不用,除非非常特殊得场景

除了以上隔离级别可以控制得情况外,还有一种就是丢失修改,错误覆盖得情况,T1事务和T2事务同时修改,导致数据被错误修改,这种情况可以使用乐观锁,即在更新数据得时候条件中增加版本号状态等字段

还用一种情况就是insert得时候,插入重复数据,一般可以使用唯一索引或主键来解决,这也是web开发中防止表单重复提交得常用手段之一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值