数据库要支持事务,必须满足4个条件:1,原子性(必须都完成。或者都不完成),2.一致性,3,隔离性(一个事务进行的时候不能影响另外一个事务的进行) 4,持久性(一旦事务完成,数据库系统必须保证任何故障都不会引起事务表现出不一致性,靠事务日志来保证)
事务日志:又分为重做日志和撤销日志。
重做日志(redo log):意味着每一个操作,在真正写到数据库里面之前事先写到日志当中了。如果服务器崩溃了,下次还可以根据重做日志,再做
撤销日志(undo log):我们的每一次操作,在操作之前要把他原来的状态记录下来。万一将来我们需要还原到原来的状态的时候,我们可以根据日志还原。
mysql支持事务的存储引擎是innodb。
事务是指,多项操作作为一个处理单元执行,要么都执行,要么都不执行
mysql进行每一个事务的时候,都会在日志先完成。意味着我们的每次增删查改都会在内存进行完之后,写入到日志当中,才会写到数据库当中。
比如我们进行delete操作,删除某一段数据的时候,首先执行是在内存当中执行的。然后再事务日志当中将某一段数据标记为删除。但是在数据文件当中是还没有被删除的。只是在日志中标记删除而已,此时我们查询也看不到该数据。当事务提交了,日志才会提交,才会真正的将其从数据文件中删除。日志中记录的只是操作,而不是操作本身。
日志不能只有一个。事务日志一般有两个。被称为日志组。
一般事务日志,不能和数据库一同放在同一块物理磁盘上,万一磁盘坏了,事务没了,数据库也没有了
事务状态:
1.活动的状态
2.部分提交状态(是指最后一条语气执行之后,正在由日志提交到磁盘上)
3.失败
4.终止
5.提交的(一旦提交无法撤销)
事务一般的并发执行的这样做的好处是:
1,提高吞吐量和资源利用率
2,减少等待时间
事务调度可以分为:
可恢复调度
无级联调度
启动事务:
start transaction;
回滚事务:(事务过程中,执行了某个操作,撤销该操作)
rollback;
提交事务:(一旦提交无法回滚)
commit;
mysql有个自动提交事务的功能。可以使用select 查看
select @@autocommit; 查看该设置是否开启,没有明确启动事务情况下,默认是启动的,因此每一句都会自动提交。mysql每执行一次操作都会使用一次IO操作。因此会消耗IO资源。建议关闭自动提交
关闭自动提交:
set autocommit=0;
关闭之后,任何一次操作应该明确使用start transaction;来启动事务。这是mysql优化的一个策略,如果不启动事务,你写的所有语气当被当做一个事务
mysql支持使用保存点,就是撤销时候,不全撤销,只是撤销到某个保存点
使用保存点:命令savepoint +保存点名称
比如。我们执行一条删除某个表中字段的命令
>delete from text where ID=78;
执行该命令完成后执行,表示在此建立一个保存点
savepoint abc;
再多执行两条删除命令
>delete from text where ID=79;
savepoint cde;
>delete from text where ID=76;
savepoint efg;
这样就设置了三个保存点。abc,cde,efg
现在我们想回滚到不删除ID=78 这个字段,怎么回滚
rollback to abc;