事务四大特性与隔离级别
事务
事务就是一组操作的集合,他是一个不可分割的整体,事务会把所有的操作作为一个整体一起向系统提交或撤销操作。
事务的操作
1为自动提交,0位手动提交。
msyql默认为自动提交,需要手动设置为手动提交。
执行成功时,进行commit提交事务,程序出时是进行回滚事务。
方式2,开启事务进行手动提交。
事务四大特性
持久性:数据库的数据最终提交之后都会存在于磁盘中,一旦进行回滚或者提交,数据都会永久的保存在磁盘中。
并发事务引发的问题
并发事务:多个事务并发运行
脏读
一个事务读取到了另一个事务还未提交的数据,
有两个并发事务A与B 事务首先进行进了查询id为1的数据,然后有进行了更新id为1的数据**,此时事务a的操作并未完全完成,没有进行提交**,并发事务B,在此时查询id为1的数据,查询的结果为事务a进行更改后还未提交的数据。
不可重复读
一个事务进行先后读取同一条记录,但是两次读取的数据不一致,称为不可重复读。
事务A在第一步查询了id为1的数据,然后事务B修改id为1的数据并且提交了数据,然后事务A在第三步又查询了id为1的数据,发现两次查询的数据不一致。
幻读
一个事务在查询数据的时候,没有数据,但是在插入数据的时候,这行数据又存在,好像出现了幻影。
事务A先查询了id为1的数据,发现并不存在,这时事务B对id为1的数据进行了插入并提交。事务a再进行插入的时候,数据插入失败,但是在查询这条数据的时候又不存在这条数据,好像出现了幻影。
事务的隔离级别
对号表示问题会出现,X白表示问题已解决。
串行化·:安全性高,效率低。
读未提交:效率最高,但是安全性最低
session表示 当前窗口有效,global全局有效。
读未提交
在并发事务下实现。
事务A 设置隔离级别为读未提交,并且查询数据,事务B开启事务,对数据进行了修改,此时并未提交事务,但是事务a在进行查询数据的时候的时候数据发生了变化。
读已提交
解决脏读问题。出现不可重读读问题,一个事务A查询两次数据不一致。
可重复读(MySQL默认)
事务A执行了两次查询的结果是一致的,尽管事务B对数据进行了修改并且提交了。但会出现幻读现象。
事务A
事务B
幻读现象;
查询数据不存在,但是插入数据又失败。
串行化
一次只允许一个事务进行操作,只有当事务A操作完成之后才能进行事务B操作,否则事务B会阻塞。