事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
事务的四个特性(ACID)
- 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况。
- 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。
事务的分类
事务分为隐式事务和显式事务两种。
- 隐式事务:该事务没有明显的开启和结束标记,它们都具有自动提交事务的功能。DML语句(insert、update、delete)就是隐式事务。
- 显示事务:该事务具有明显的开启和结束标记。使用显式事务的前提是你得先把自动提交事务的功能给禁用。禁用自动提交功能就是设置autocommit变量值为0(0:禁用 1:开启)
事务的并发问题
- 脏读:读到了脏数据,即无效数据。
- 不可重复读:是指在数据库访问中,一个事务内的多次相同查询却返回了不同数据。
- 幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。
事务的四种隔离级别
- read uncommitted(读未提交):允许事务读取未被其他事务提交的变更。(脏读、不可重复读和幻读的问题都会出现)。
- read committed(读已提交):只允许事务读取已经被其他事务提交的变更。(可以避免脏读,但不可重复读和幻读的问题仍然可能出现)
- repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。(可以避免脏读和不可重复读,但幻读仍然存在)【Mysql默认隔离级别】
- serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可避免,但性能十分低下(因为你不完成就都不可以弄,效率太低)
事务的特性怎么保证
-
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部执行失败。通过数据库的回滚机制来保证。如果事务执行过程中出现错误,数据库会回滚事务,撤销所有已执行的更改。
-
一致性(Consistency):在事务开始之前和结束之后,数据库的一致性要得到保证。数据库中的数据在任何时候都必须保持一致,这通常通过业务逻辑和数据库约束来实现。
-
隔离性(Isolation):各个事务之间相互隔离,事务的操作不会被其他事务干扰。通过设置不同的隔离级别,可以控制事务之间的隔离性。
-
持久性(Durability):事务一旦提交,数据的更改就应该永久保存,并且不应该受到系统故障的影响。数据库系统通常通过持久化存储和日志来保证这一点。