事务
只与 DML 语句有关 ( 关于数据的 增删改 )
一个事务由一条或多条 DML 语句组成,一个事务在提交事务后才会将数据彻底修改到数据库中,再提交前,我们可以用回滚回到指定位置,相当于可以撤回错误操作
在 MySQL 中默认的为 自动提交事务 ,即每执行一条 DML 语句,就提交一次 ( 即不能回滚 ),直接修改在数据库中
事务操作
- 开启事务 : start transaction 或 set autocommit=off( 等于 0 也行 )
- 提交事务 : commit
- 回滚事务 ( 回滚到开启事务点 ) : rollback
- 标记事务过程中的保存点 : savepoint 标记名
- 删除标记点 : release savepoint 标记名
- 回滚事务 ( 回滚到指定标记点 ) : rollback to 标记名
- 设置事务隔离等级 ( 当前会话 ) : set session transaction isolation level 等级名 ;
- 设置事务隔离等级 ( 全局级 ) : set global transaction isolation level 等级名 ;
- 查看事务隔离等级 ( 当前会话 ) : select @@session.tx_isolation ;
- 查看事务隔离等级 ( 全局级 ) : select @@global.tx_isolation ;
事务的四个性质
原子性 ( A )
原子性是指事务过程中的操作,对数据的修改要么全部执行成功,要么全部失败,即相当于事务是最小的工作单元,不可再分
一致性 ( C )
一致性是指执行事务前后的状态要一致,可以理解为数据一致性
( 听大佬这么说 一致性强调的最终状态,要么是初始状态(有可能事务回滚了),要么是最终状态( 事务成功执行后 )。原子性,隔离性,持久性这三个特性是为了约束事务最终实现数据的一致性,我感觉,原子性和一致性虽然很像,但是一个强调的是操作,一个强调的是状态,我们对出数据的操作(原子性),对事务之间的隔离(隔离性),对最终状态的保存(持久性),都是为了完成数据的全部正确修改(一致性) )
隔离性 ( I )
不同的事务之间,具有一定的隔离等级,控制事务之间相互影响的程度( 可以设置隔离等级 )
持久性 ( D )
事务最终结束时,事务对数据的操作即被持久化地保存到数据库中,持久化地保存在硬盘上
事务之间的隔离性 ( 从低到高 )
如何简单的并发 ( 直接多开几个 MySQL 窗口就行了 )
读未提交 : read uncommitted
会导致脏读现象 ( 即会读到另一个事务未提交的数据 )
读已提交 : read committed
解决了脏读现象 ( 即只能读到其他事务提交之后的数据 )
但是出现了不可重复读现象 ( 即读取过程中,可能多次读取的数据不相同了,别的事务改变了数据 )
( 是 Oracle 默认的隔离级别 )
可重复读 : repeatable read
解决了不可重复读现象 ( 在事务开启后,每一次读取的数据都是相同的 )
但是出现了幻读现象 ( 即读到的数据可能已经不存在,或已经被修改了 )
( 是 MySQL 默认的隔离级别 )
序列化 ( 串行化 ) : serializable
解决了幻读现象 ( 直接关闭了并发,只能一个事务一个事务进行 )