数据库事务控制

数据库事务控制,第1张

数据事务控制 1.事务的基本介绍
	1. 概念:
		*  如果一个包含多个步骤的业务 *** 作,被事务管理,那么这些 *** 作要么同时成功,要么同时失败。
		
	2.  *** 作:
		1. 开启事务: start transaction;
		2. 回滚:rollback;
		3. 提交:commit;
	
2.事务的四大特征

原子性:

是不可分割的最小 *** 作单位,要么同时成功,要么同时失败。

持久性:

当事务提交或回滚后,数据库会持久化的保存数据。

隔离性:

多个事务之间。相互独立

一致性:

事务 *** 作前后,数据总量不变

3.事务的隔离级别

概念:

多个事务之间隔离的,相互独立的。但是如果多个事务 *** 作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题

存在问题:

1.脏读:在事务A执行过程中,事务A对数据资源进行了修改,事务B读取了事务A修改后的数据。由于某些原因,事务A并没有完成提交,发生了Rollback *** 作,则事务B读取的数据就是脏数据。

2.不可重复读:事务B读取了两次数据资源,在这两次读取的过程中事务A修改了数据,导致事务B在这两次读取出来的数据不一致。这种在同一个事务中,前后两次读取的数据不一致的现象就是不可重复读。(Nonrepeatable Read)。

3.幻读:事务B前后两次读取同一个范围的数据,在事务B两次读取的过程中事务A新增了数据,导致事务B后一次读取到前一次查询没有看到的行。幻读和不可重复读有些类似,但是幻读强调的是集合的增减,而不是单条数据的更新。

隔离级别

1.read uncommitted:读未提交

这种事务隔离级别下,select语句不加锁。

此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。

  • 产生的问题:脏读、不可重复读、幻读

2.read committed:读已提交 (Oracle)

如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

  • 产生的问题:不可重复读、幻读

3.repeatable read:可重复读 (MySQL默认)

可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务(包括了读写),这样避免了不可重复读和脏读,但是有时可能会出现幻读。(读取数据的事务)可以通过“共享读镜”和“排他写锁”实现。

  • 产生的问题:幻读

4.serializable:串行化

提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询 *** 作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

  • 可以解决所有的问题

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5612283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存