事务特性
事务应该具有 4 个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特
性。
原子性(atomicity)
一致性(consistency)
持久性(durability)
隔离性(isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
(对数据库的并行执行,应该像串行执行一样)
事务的隔离级别
事务的隔离级别是数据库系统中用于控制多个并发事务之间数据访问的方式,以避免出现脏读、不可重复读和幻读等问题。
SQL标准定义了以下四种隔离级别:
读未提交(Read Uncommitted):这是最低级别的隔离级别,一个事务可以读取到其他事务尚未提交的数据,可能导致脏读问题。
脏读 是指读取到了未被其他事务提交的数据之后,其他的事务又回滚了。
提交读(Read Committed):一个事务只能读取到已经提交的数据,避免了脏读问题,但可能出现不可重复读的问题。
不可重复读是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据,针对的是对同一条数据的更改。
可重复读(Repeatable Read):在同一个事务中多次读取相同的数据返回的结果是一样的,避免了脏读和不可重复读问题,但幻读依然存在。
幻读(Phantom Read)是指在一个事务内读取某个范围的记录时,另一个并发事务在该范围内插入了新的记录,当原始事务再次读取该范围的记录时,会发现一些之前没有的“幻”记录。针对的是一个范围内的结果集不同
串行化(Serializable):这是最高的隔离级别,通过强制事务串行执行,避免了脏读、不可重复读和幻读问题,但可能导致大量超时和锁竞争问题。
不同隔离级别的选择取决于应用程序对数据一致性和性能的需求。较高的隔离级别提供了更高的数据一致性保证,但可能会牺牲一定的性能。因此,需要根据具体的应用场景和需求来选择合适的隔离级别。
关于读未提交隔离级别是否会出现幻读,答案是会。在读未提交隔离级别下,一个事务可以读取到其他事务尚未提交的数据,这包括其他事务插入的数据,从而导致幻读问题。
MySQL 默认的事务隔离级别为 repeatable-read
查看当前mysql数据库的隔离级别show variables like '%tx_isolation%';
事务的语法
一、开启事务
1、begin
2、START TRANSACTION(推荐)
3、begin work
二、事务回滚
rollback
三、事务提交
commit
四、还原点
savepoint
show variables like '%autocommit%'; 自动提交事务是开启的
set autocommit=0;
insert into testdemo values(5,5,5);
savepoint s1;
insert into testdemo values(6,6,6);
savepoint s2;
insert into testdemo values(7,7,7);
savepoint s3;
select * from testdemo
rollback to savepoint s2
rollback