事务
多进程进行并改变同一个数据,如果没有进行版本控制,就会出现数据不确定的问题,为此引入了事务的概念。可以进行数据回滚,解决潜在的问题。
事务的概念
一组的DML组成,这一些的DML要么同时成功,要么同时失败。
一个完整的事务需要满足四个属性:1,完整性 2,一致性 3,隔离性
4,持久性
版本支持
目前的MySQL支持的储存引擎 InnoDB存储引擎,其他的储存引擎不支持事务。
从下面的表之中可以看见所有的储存引擎的本事特点以及是否有事务的作用。
事务的提交方式
根据的不同的事务提交方式分为自动提交与手动提交。
对于查看是否开启自动提交的命令如下
show variables like 'autocommit';
自动提交本身针对的就是单个SQL。
单个SQL语句本身就是一个事务,如果取消自动提交,单的sql需要直接进行手动进行commit进行提交。
修改自动提交,数值为1,就是开启自动提交。数值为0,就是关闭自动提交。
set autocommit=1;
设置为手动提交
没有插入数据之前的时候,进行slect
提交之后的的数据对比(这里的id =32数据之前没有提交(没有commit))
这里表明自动提交是对于单句sql语句的操作。
事务的所有操作
开始事务
begin;
strat;
直接进行事务的创建
设置回滚点
savepoint s1;
设置回滚点是s1
回滚
rollback s1;
回滚数据到s1点位置(如果commit之后,就不会进行回滚点操作了)
提交事务
commit;
事务的性质
原子性
事务的SQL语句,需要同时进行起作用,如果没有成功的话!整个事务都不会执行成功。会回归到事务之前的状态。
持久性
事务结束之后,对于数据的修改是永远的,就是MySQL软件出现问题,数据也不会失去。
隔离性
数据库允许多个事务同时对于其数据读,写和修改数据。隔离性防止多个事务并发执行时导致数据的不一致。
一致性
满足上面的三个的性质,就是满足一致性。让数据满足预设的规则,包括数据的精度,串联性,直发性的完成预定的工作。
事务隔离级别
多事务进行访问,会出现事务相互影响的情况。为了保证不同事务执行过程不受干扰,就有了重要的特征:隔离性。
允许不同的事务之间的受不同的程度的干扰,就有了重要的特征隔离级别。
事务出现错误
不同的隔离级别出现不同的错误现象,脏读,不可重复读,幻读。
脏读:
当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 数据是还没有提交的数据,另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作是不正确的。
不可重复读:
同一个事务,多次读多同一个数据,数据的不同。
幻读:
事务A与事务B进行共同执行相关的操作。事务A执行select,事务B执行insert之后,事务A执行select,可以查看到了事务B的执行条件之后表内容。正常的操作应该是事务A看不到事务B的操作。
读取方法
快照读:这里就可以读取其他事务更新的东西
select * from table_name lock in share mode;
select * from table_name for update;
事务级别
未提交(RU模式):
都可以看到未提交的数据内容(相当于没有隔离性质)已提交读(RC模式):只可以看到另外一个事务提交之后的数据,使用快照读()之后,数据就会更新提交的数据。
可重复读(RR模式):读取的数据应该是使用快照读时候的数据,使用当前读,数据会更新到提交事务之后的数据。
可串行化(S模式):所有的事务之间的数据不共享,完全隔离
不同的隔离级别声明的名称
查看和设置隔离级别
隔离级别分成全局隔级别,当前会话级别。创建一个新的会话,使用的隔离级别就是使用全集的隔离级别。
select @@global.tx_isolation;//查看全局的隔离级别
select @@session.tx_isolation;//查看当前会话的隔离级别
设置隔离级别
这里的session可以换成global,进行操作。READ UNCOMMITTED可以换成其他的类型的隔离级别。
set session transaction isolation level READ UNCOMMITTED;
这里的隔离级别,设置会话为RU模式。其他 的模式也是可以使用差不多的操作方法。