事务是用户定义的一个数据操作序列,是一个完整的工作单元,要么全部执行,要么全部不执行。
事务具有四大特性:原子性、隔离性、一致性、持久性
原子性:
事务所包含的所有操作,要么全部执行,要么全部回滚不执行。
一致性:
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱
隔离性:
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的。
并发可能存在的问题:
1.脏读:事务A修改了数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,那么事务B读到的就是脏数据。
2.不可重复读:在同一个事务中,对同一份数据的读取结果不一致,比如:事务B在事务A提交前后,读取数据的结果可能不一样。
3.幻读:在同一个事务中,同一个查询多次返回的结果不一致。比如:事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。
事务的四个隔离级别:
Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。
持久性:
事务一旦提交,数据库中的数据必须被永久的保存下来。即使遇到服务器系统崩溃或服务器宕机等故障,只要数据库重启,数据库中的数据就会恢复到事务执行完之后的状态。
隔离性是由DBMS的并发控制子系统实现的;
持久性是由DBMS的恢复管理子系统实现的;
确保单个事务的一致性是编写事务的应用程序员的职责;
确保原子性是数据库本身的职责,由DBMS的事务管理子系统来实现。
参考链接:https://www.jianshu.com/p/aa35c8703d61,