一般使用了事务就使用了锁,但事务的实现并非都是靠锁实现的
事务的并发控制技术是使用锁跟mvcc技术实现的
锁是并发控制的基础,并在基础之上实现可mvcc机制,用来提高锁带来的低效率问题

mvcc

多版本并发控制器,是一个抽象概念,一般使用锁的读取都是当前读,最新的数据,不加锁的读都是快照读 不一定是最新的数据,用来实现读写不冲突,解决不加锁的读写冲突,无锁并发控制,增加一个修改的时间戳,保留每次修改的版本,读操作是读事务开始之前的数据快照,
数据隐藏字段3个不止三个
最新修改添加的事务id
回滚指针,指向上一个版本
隐藏自增id(隐藏主键)当表没有主键的时候,会自动生成一个聚簇索引,

特性:

原子性:要么全部执行,要么全部回滚
一致性:数据库从一个一致性状态到另一个一致性状态,事务执行之前和执行之后必须处于一致性状态
隔离性:多个用户访问数据库,操作一个表,每个用户都开启事务,每个事务不能被其他事务的操作所影响,事务之间相互隔离,
持久性:事务一旦提交数据库的修改就是永久性的,

导致的问题

脏读:
当一个事务对数据进行了修改,但是还没有完成整个事务,提交到数据库,此时另外一个事务读取了这个数据,并使用了该数据,因为这个数据再第一个事务中还没有进行提交操作,另一个事务读取到的数据是脏数据,依靠脏数据进行的操作可能是不正确的
一个事务读取另外一个事务未提交的数据,
不可重复读:
一个事务多次读取一条数据,在这个事务没有结束时,另外一个事务也访问了该数据,并且改变了数据,这样导致第一个事务两次读取的数据不一致,这就是不可重复度
一个事务在多次读取数据期间,另一个事务将读取数据修改,导致多次读取数据不一致(修改操作)
幻读:
一个事务多次读取一条数据,在这个事务没有结束时,另外一个事务也访问了该数据,并且添加删除了数据,这样导致第一个事务两次读取的数据不一致,这就是幻读
幻读跟不可重复读类似,都是多次读取数据不一致,不过不是因为数据被被修改了,而是被删除或者添加了

隔离级别:

read uncommitted
读未提交,一个事务可以读取另一个事务未提交的数据(脏读/幻读/不可重复读)
解决方法 read committed 读提交 能解决脏读问题
read committedWW
读 提交,允许读取并发事务已经提交的数据(两次读取数据不一致,不可重复读/幻读)
解决方法 repeatable read
repeatable read
重复读 就是在开始读取数据时,不在允许修改操作,mysql就是这一级别(幻读,不允许修改,但是允许添加删除,数据久不一致了)
解决方法 serializable
serializable 序列化
是最高级别的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免上面的问题,但是效率低下,比较耗数据库性能,一般不用