事务心得
2021-01-10 17:02 Spiderman25 阅读(59) 评论(0) 收藏 举报alter table Name engine=innodb;
start transaction: 开始一个事务
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
set autocommit = false;
savepoint : 保存点
rollback to 保存点: 回滚到某个保存点.
rollback : 回滚
commit : 提交
读未提交 可造成:脏读、不可重复读、幻读。
读已提交 可造成:不可重复读、幻读。PS:同一事务中,可以看到自己还没提交的修改。
可重复读
可造成:幻读。
原理:无锁,读历史版本。如果读数据量,就算别的事务进行增加、删除操作,再次读数据量时,也是同样的数据量。如果记录,别的事务进行修改删除,再次读,还是一样的记录,反正之前读到什么,再次读时也肯定是同样的数据,像自己骗自己一样,但如果是更新操作,就会读最新的,不读历史版本,例如把红色变成黑色,之前有读到红色,但是别的事务已经修改了,这时更新记录为0条。
可串行化 可造成:无。原理:表锁,如果是select count(1),则别的事务可以修改,因为对数量不造成影响,如果是select *之类的,则什么另外的事务增删改sql长什么样都要等待,就算影响的不是选中的。
可重复读与可串行化区别
一个是骗自己,即别人一样可以操作,一个是不许让别人操作。
心得:就算没有提交事务,执行到的sql已经影响到数据库了,最后的提交只是设置状态而已,所以设置为读未提交可以读到没有提交的数据。
关于锁:如果在一个事务涉及到了一个数据的增删改操作,在别一个事务中也对这个数据进行增删改操作,那么另一个事务就会等待,只要两个数据对应的唯一索引字段相同就会等待。
spring中子线程与会线程不同一个连接,所以不是同一个事务。
把锁对应的进程中断,锁就释放。
浙公网安备 33010602011771号