数据库-事务

数据库-事务之后 SessionA 中的事务再根据相同的条件 studentno0 查询表 student 得到的结果集中包含 SessionB 中的事务新插入的那条记录 这种现象也被称之为幻读

大家好,欢迎来到IT知识分享网。

1、事务的基础概念

事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。

2、事务的特点

一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。

3、事务的限制

MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。

4、事务的ACID原则

原子性:每一个事务都是不可再分的,在数据库中,整个语句要么执行要么不执行; ​ 一致性:在执行性=事务前和执行完事务之后数据库中的数据完整性没有被破坏; ​ 隔离性:事务的执行是互不干扰的,一个事务不可能看到另一个事务运行时操作的数据(通常使用加锁的方式来保证数据库的隔离性); ​ 持久性:事务执行成功后,该事务对数据库的更改是永久性的,数据变了之后就不会再变,不会被回滚; ​ ​ 事务的原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。 •REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。 •UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

5、实现事务的方法

START TRANSACTION 开始一个事务,标记事务的起始点; SET AUTOCOMMIT 使用该语句来改变自动提交模式,等于0时关闭自动提交模式,等于1时开启自动提交模式。默认为1,使用事务时为0。 COMMIT 提交一个事务给数据库。 ROLLBACK 将事务回滚,数据回到本次事务的初始状态。 

6、MySql实现事务的方法

create table bank(   bid int primary key auto_increment,   bname varchar(10),   bmoney decimal(20,2) ); insert into bank(bname,bmoney) values('杨文琦',5); insert into bank(bname,bmoney) values('周永康',0000); ​ select * from bank; ​ update bank set bmoney = 0000 where bname='周永康'; update bank set bmoney = 5 where bname='杨文琦'; ​ ​ -- 事务的操作 -- 1. 关闭自动提交 set autocommit = 0; -- 2. 开始事务 start transaction; -- 3. 一组sql语句 update bank set bmoney = bmoney-1000 where bname='周永康'; update bank set bmoney = bmoney+1000 where bname='杨文齐'; ​ -- 4. 结束事务(判断)   -- 提交   commit;   -- 回滚   rollback; -- 5. 开启自动提交 set autocommit = 1;

7、数据库中锁的分类

基于锁的属性分类: 共享锁(读锁、S锁)、排他锁(写锁,X锁); 基于锁的粒度分类: 表锁、行锁(记录锁、间隙锁、临键锁)。 基于锁的状态分类: 意向共享锁、意向排它锁。

8、事务的隔离级别

事务的并发问题

在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写、脏读、不可重复读、幻读的问题。
  1. 脏写
    脏写(Dirty Write ) 对于两个事务Session A、Session B,如果事务Session A 修改了另一个未提交事务Session B 修改过的数据,那就意味着发生了脏写 
  2. 脏读
    脏读(Dirty Read ) 对于两个事务Session A、Session B,Session A 读取了已经被Session B 更新但还没有被提交的字段。 之后若Session B 回滚,Session A 读取的内容就是临时且无效的。 Session A和Session B各开启了一个事务,Session B中的事务先将studentno列为1的记录的name 列更新 为'张三',然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的为'张三',而 Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据,这种现象 就称之为脏读。 
  3. 不可重复读
    不可重复读(Non-Repeatable Read ) 对于两个事务Session A、Session B,Session A 读取了一个字段,然后Session B 更新了该字段。之后 Session A 再次读取同一个字段,值就不同了。那就意味着发生了不可重复读。 我们在Session B中提交了几个隐式事务(注意是隐式事务,意味着语句结束事务就提交了),这些事务都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可以查看到最新的值,这种现象也被称之为不可重复读。 
  4. 幻读
    幻读(Phantom ) 对于两个事务Session A、Session B, Session A 从一个表中读取了一个字段, 然后Session B 在该表中插 入了一些新的行。之后, 如果Session A 再次读取同一个表, 就会多出几行。那就意味着发生了幻读。 Session A中的事务先根据条件studentno > 0这个条件查询表student,得到了name列值为'张三'的记录;之后Session B中提交了一个隐式事务,该事务向表student中插入了一条新记录;之后Session A中的事务再根据相同的条件studentno > 0查询表student,得到的结果集中包含Session B中的事务新插入的那条记录,这种现象也被称之为幻读。我们把新插入的那些记录称之为幻影记录。 
  5. InnoDB的MVCC
    MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个 版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有 了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。 MVCC 的实现依赖于:隐藏字段、Undo Log、Read View。 
    InnoDB就是通过MVCC机制解决可重复读中的幻读问题。 

事务的隔离级别

1. READ_UNCOMMITTED: 读未提交 2. READ_COMMITTED :读提交(不可重复读) 3. REPEATABLE_READ :可重复读 4. SERIALIZABLE :串行化 每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的并发事务问题也就越多,同时也意味着加的锁就越多,所以性能也会越差。 

事务隔离级别解决的问题

1、READ_UNCOMMITTED: 事务读取:不加锁 事务写入:加写锁 解决问题:脏写 存在问题:脏读,不可重复度,幻读 2,READ_COMMITTED: 事务读取:加读锁(每次select完成后都会释放读锁) 事务写入:加写锁 解决问题:脏写,脏读 存在问题:不可重复读、幻读 3、REPEATABLE_READ: 事务读取:加读锁(每次select完不会释放锁,而是事务结束后才会释放锁,但如果是mysql的innodb就会加间歇锁) 事务写入:加写锁 解决问题:脏写,脏读,不可重复读,幻读(如果是mysql的innodb则已经解决) 存在问题:幻读(如果是mysql的innodb则不存在这个问题) 4. SERIALIZABLE: 不管读取还是修改所有的事务都会串行化执行,一个事物的执行必须等到其他事务结束 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119597.html

(0)
上一篇 2025-11-04 12:26
下一篇 2025-11-04 12:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信