1.1、原子性,原子性指整个数据数据库的每个事务都是不可分割的单位。只有十五中所有SQL语句都执行成功,才算整个事务成功,事务才会被提交。如果事务中任何一句SQL执行失败,整个事务都应该被回滚。
1.2、一致性,是指数据库将一种一致性状态转换为另一种一致性状态。不允许数据中的数据出现新老数据都有的情况,要么都是老数据,要么都是新数据。用更书面化的表达就是:数据的完整性约束没有被破坏。
1.3、隔离性,是指一个事务在该事物提交前对其他事务都不可见,它通过锁机制实现。
1.4、持久性,是指事务一旦被提交,其结果是永久性的。即使发生宕机等故障,数据库也能将数据恢复。
MYISAM 引擎不支持事务,INNODB 引擎支持事务。
ps:两表引擎的其他区别见博文 https://blog.csdn.net/qq_35642036/article/details/82820178
#开启事务,两种语法
begin
start transaction
#提交事务
commit
#回滚事务
rollback
#建立保存点(一个事务可以有多个保存点)
savepoint xxx
#删除保存点(没有该保存点时会抛出异常)
release savepoint xxx
#回滚事务到某个保存点
rollback to [savepoint] xxx
#检查事务的自动提交状态
show variables like '%commit%';
#修改事务的自动提交方式(仅保持一个连接时间,断开连接就失效)
--全局修改
set global autocommit=0;
--局部修改
set session autocommit=0;
4.1、表级锁:锁住整张表。特点:开销小,加锁快,锁冲突概率高,并发度小。(myisam,innodb,memory存储引擎支持)
4.2、行级锁:锁住一条数据。特点:开销大,加锁慢,锁冲突概率性小,并发度大。(innodb存储引擎支持)
4.3、页级锁:锁住一页数据。特点:以上特点折中。(innodb中一页数据为16kb)(innodb,BDB存储引擎支持)
5.1、排它锁:当某一事务给一行数据加上排他锁时,那么其他事务对此行数数据不能读,不能写,也不能喝其他事务一起使用
5.2、共享锁:当某一事务给一行数据加上共享锁时,其他事务可以对此行数据进行读操作,但是不能写,不能与排他锁一起使用
对于update、delete、insert语句,InnoDB会自动给涉及到的数据加排它锁。
对于select语句,InnoDB不会加任何锁
5.3、语法:
#排它锁
select xxx from 表名 where ... for update;
#共享锁
select xxx from 表名 where ... lock in share mode;
5.4、测试:
排它锁:
加排他锁后,另一个排它锁查询
加排他锁后,使用共享锁查询
共享锁:
加共享锁后使用另一个共享锁查询
加共享锁后,使用排他锁查询
加共享锁后,更新数据
check point:检查点,检查点前的事务都是已经提交或回滚过的。
ps:MySQL的checkpoint https://www.cnblogs.com/lintong/p/4381578.html
undo log:回滚日志,存储在共享表空间的ibdata*文件,存储的是 check point日志序列号。
redo log:重做日志,存贮子日志文件ib_logfile里。
mysql通过重做日志实现事务的持久性。重做日志有两部分组成,一是内存中的重做日志缓存区(易丢失),另一个是磁盘上的重做日志,它是持久的。
当在事务中执行写操作时,它会先把数据从磁盘读入内存,并更新内存中缓存的数据,然后生成一条重做日志并写入重做日志缓存,当事务真正提交时,MySQL会将重做日志中的内容刷新到重做日志文件,再将内存中的数据更新到磁盘上。
重做日志执行时间:
在mysql中事务执行commit提交后,但服务器挂了,数据并未写入磁盘,在mysql重启服务后会重新执行这个重做日志写入数据。
mysql通过回滚日志保证事务的原子性。事务回滚的本质是在sql执行之前在回滚日志中生成了一条相反的sql。
回滚日志执行时间:
1、执行rollback回滚语句时
2、在事务执行之后,提交命令执行之前出现异常,在下次mysql服务重启时会执行。