SQL事务(transaction)
1.事务的含义
由一个或多个sql语句的组成,每个sql语句都是相互依赖的,是不可分割的,但事务中的sql语句只会存在都执行或都不执行(当事务中的sql语句执行失败,数据库数据就会回滚到执行前的状态,当所有的语句执行成功才代表这个事务执行成功)
2事务的四大特性
2.1原子性:
事务是一个不可分割的最小单位,事务中的操作只存在都发生与都不发生在两种情况
2.2一致性:
事务只会使数据库从一个一致状态转换为另一个一致状态,其它事务只会查看或操作到这个事务执行前或执行后的一致状态,不会查看或操作事务执行的中间状态
2.3隔离性:
事务的执行是独立的,一个事务的执行是不能被其它事务干扰的,两个或多个并发执行的事务的操作与数据是与其他事务隔离的,并发事务之间的执行是不能互相干扰的
2.4持久性:
一旦事务执行或操作成功后,其对数据的改变时永久的,接下来的操作与故障是对其无影响的
3.事务的分类
3.1显式事务
手动使用begin开始一个事务,再输入一个或多个sql语句,一次执行,当其中的sql语句都执行成功,则使用commit提交语句,当其中的sql语句执行出错则使用rollback回滚到事务执行前的状态
3.2隐式事务
在开启隐式事务时,当用户输入一条sql语句时,数据库便会自动为其创建一个事务,当sql语句执行成功,数据库便会自动提交这个事务,若执行失败则回滚到事务执行之前的状态。
3.3两种事务的区别
显式事务可以执行一组sql语句,用户可以精确控制事务执行,但比隐式事物的执行所需要的代码更多,更适用进行一组操作,隐式事务提供更简洁的代码与操作方式,更适合单个操作。性能方面,显示事务需要更多的资源来维护事务的状态与锁定机制,但隐式事务更轻量,适用与高并发与大规模操作场景。
4.事务并发时出现的问题分类
事务的执行时间不是有序的,多个事务有可能在同一时刻进行执行,多个事务对一张表进行并发操作时,就会出现这些并发问题。
4.1脏读(读取到更新失败的数据):
当两个事务T1、T2,T1读取的是T2更新但未提交的数据,当T2失败进行回滚时,T1读取的就是无效的数据
4.2不可重复读(两次分别读取字段内容不一致):
当两个事务T1、T2,T1事务中存在两次读取同一个字段的操作,但在T1读取完第一次后,并发的T2对这个字段进行了修改,当T1执行第二次读取时获取到的值就不一样,也就造成两次读取值不相同的情况,造成了不可重复读的后果
4.3幻读(两次分别读取字段数量不一致):
当两个事务T1、T2,T1事务中存在两次读取同一个字段的操作,当T1在读取完第一次后,并发的T2增加或删除字段,会造成T1第二次读取到的值行数比第一次多或者少,就会产生幻读的情况。
5.事务的隔离级别
5.1read uncommited(读未提交数据):
允许事务读取未提交的变更(会出现脏读、幻读、不可重复读)
5.2read commit(读已提交数据):
只允许事务读取提交的变更(会出现幻读、不可重复读)
5.3repeatable read(可重复读):
允许这个事务多次读取一个字段数据,但在读取数据期间,禁止其它事务对这个字段的修改(update)(会出现幻读)
5.4serializable (串行化):
允许一个事务多次对表进行读取,但在这个事务执行期间,禁止其它事务对数据进行增减修改。