目录
事务
数据库事务
一次对数据库操作过程,有多条sql,视为一组,一次执行,一组sql要么都提交成功,要么都失败。保证数据的完整性,mysql中只有i使用nnodb引擎的数据库或表支持事务。
事务特性
原子性:一个事务中的多条sql要么都执行成功,要么都失败,回滚到执行前的状态。
隔离性:数据库中的事物可以多个同时执行,有读未提交、读已提交、可重复读和串行化四种。
持久性:事务提交后,保证数据永久保存,即使宕机。
一致性:保证数据是完整可靠的,原子性、隔离性、持久性都是为了保证数据的一致性。
事务设置
关闭自动事务提交:
set global autocommit = 0;
查看事务自动提交开启的情况:
show global varlables like ‘autocommit’;
— 开启事务:
begin;
(sql语句)
rollback;– 事务回滚
commit; — 事务提交
事务隔离级别
查看事务的隔离级别:
SELECT @@session.transaction_isolation,@@transaction_isolation;
1.读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
另一个事务正在更改数据,但还没有提交事务,该事物若读取数据,可能造成脏读,不可重复读,幻读。
2.读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
一个事务只能读到另一个事务提交后的数据,解决了脏读问题,但还存在不可重复读,幻读。
不可重复读:
一个事务在执行事务时,先后读两次,两次结果不相同。
3.可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
一个事务在执行时,多次读取数据是一致的。
解决了不可重复读问题,但是幻读问题没有完全解决。
例如下图,事务1不加for update 执行时,事务2添加一行记录后事务1不会幻读,当事务2提交后,事务1若有for update则会出现幻读。
幻读:
一个事务读取到的数据量不同(insert delete)
4.串行化
事务只能一个一个进行,即使一个事务写,另一个事务读不可以,但是读读可以,读写不可以。
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE
事务实现原理
原子性:undolog
mysql使用undolog日志文件,用来记录增删改操作的反向作
insert delete
delete insert
update update
出现异常,事务回滚,执行对应操作的反向操作。
持久性:redolog
redolog
当数据库事务提交后,保证数据是不可撤销。
当sql发送到mysql后,事务还未提交之前,如果发生断电/宕机
会将sql保存到redolog日志文件中
在mysql重启时 执行redolog中的sql
隔离性:
MVCC:多版本并发控制,每次事务对某记录操作时,会生成一个操作的版本链
如果隔离级别是读已提交:
在同一个事务中,每次读取时都会从版本链上生成一个快照(readView)
每次读到得是查询时最新的数据。也称为当前读。
如果隔离级别是可重复读:
在事务第一次读取数据时,会从版本链上生成一个快照(readView)
之后再次读取时,仍然会从上次的版本快照中读,
所以隔离级别是可重复读,也称为快照读。
原文地址:https://blog.csdn.net/weixin_63541561/article/details/135853023
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_61907.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!