事务是什么?
是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
事务有什么作用?
保证事务执行整个过程中数据库操作的正确性(ACID)。
多事务同时执行的时候,可能会出现的问题?
脏读:读到其他事务未提交的内容
不可重复读:一个事务中两次相同sql得到的结果不一致
幻读:其他事务同时编辑表内容,当前事务处理结果会导致新编辑数据没有别处理到,产生幻读。
事务的四个特征?
A(原子性):事务不可分割,要么都成功要么失败
C(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
I(隔离性):据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
D(持久化):事务完成后,数据写入数据库
事务的隔离级别?
读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到。
读已提交:别人改数据的事务已经提交,我在我的事务中才能读到。
可重复读:别人改数据的事务已经提交,我在我的事务中也不去读。
串行:我的事务尚未提交,别人就别想改数据。
这4种隔离级别,并行性能依次降低,安全性依次提高
MySQL默认的事务隔离级别是?
可重复读-repeattable-read
怎么配置MySQL事务的隔离级别?
在my.cnf tx-isolation/transacton_isolation
事务是在MySQL那个模块执行?
存储引擎-只有innodb支持事务
事务隔离是怎么通过read-view(读视图)实现的?
每一行数据有多个版本(内容不一样,用于事务回滚),当我们读取数据时,要用当前事务id去对比版本中事务ID,寻这个版本链路找到自己可见的版本数据。
mvcc是什么?执行过程?
mvcc-多版本并发控制
执行过程:每行数据(多次操作)有多个事务版本(内容不一样,用于事务回滚),当多个并发事务要操作这个数据时,判断事务是否可以读取到目标行那个版本的数据时,需要用当前事务ID和目标行多个版本的事务ID对比,规则如下:
目标行版本事务ID小于当前事务,可以读取。
目标行版本事务ID大于当前事务,不可以读取。
如果当前事务自己修改的数据,当前事务还是可以看到的
为什么不要使用长事务?
长事务导致表空间持续增长,即便是事务提交或者回滚后,表空间大小仍然不会被缩小。
长事务的存在导致锁发生冲突或等待的几率大大增加。
如何避免长事务?
从数据库方面:
a.设置autocommit=1,不要设置为0。
b.写脚本监控information_schemal.innodb_trx表中数据内容,发现长事务,kill掉它。
c.配置SQL语句所能执行的最大运行时间,如果查过最大运行时间后,中断这个运行事情长的SQL语句。
d.设置回滚表空单独存放,便于回收表空间。
从业务代码方面:
a.确认是否使用了autocommit=0的配置,如果有关闭它,然后再业务代码中手动的使用begin;commit来操作。
b.检查业务逻辑代码,能拆分为小事务的不要用大事务。
c.检查代码,把没有必要的select语句被事务包裹的情况去掉。
怎么开启事务?
begin/start transaction