1、开启事务:
start transaction;
或者set autocommit = off;
2、保存记忆点a:savepoint a;
3、回滚到记忆点a:rollback to a;
或者回滚所有rollback;
4、提交事务:commit;
注:事务是默认开启并自动提交的
脏读:对于一个事务对于数据库的操作还并未提交,但其他事务能够看到操作结果; 产生脏读
不可重复读:对于一个事务对于数据库进行修改或删除的操作并且已提交,其他访问的事务能够查到操作后的结果,导致每次读到的结果都不同,不可重复读
幻读:对于一个事务对于数据库进行插入的操作并且已提交,其他访问的事务能够查到操作后的结果,导致每次读到的结果数都不同,产生幻读
事务隔离:多个连接开启各自事务操作数据库时,数据库要负责隔离操作,以保证各个连接获取数据时的准确性。如果不考虑隔离性,就会引发脏读、不可重复读、幻读;
事务隔离级别:定义了事务与事务间的隔离程度,只与各自连接设置的隔离级别有关,与别的连接设置的隔离级别无关;(如果一连接隔离级别为不可重复读,自己的连接为读未提交,那么另一连接提交前所进行的操作的结果,自己可以查询到。反之,因为另一连接的隔离设置级别为可重复读,自己的操作结果对方看不到)
MySQL隔离级别(4种) | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(read uncommitted) | √ | √ | √ | 不加锁 |
读已提交(read committed) | × | √ | √ | 不加锁 |
可重复读(repeatable read) | × | × | × | 不加锁 |
可串行化(serializable) | × | × | × | 加锁 |
√ 表示可能,× 表示不会发生,加锁表示当前事务对表的操作提交之前,别的事务不能对该表进行操作
#查询当前会话隔离级别 5.0版本
select @@tx_isolation;
#查询当前会话隔离级别 8.0版本
select @@transaction_isolation;
#查询系统当前隔离级别 5.0版本
select @@global.tx_isolation;
#查询当前会话隔离级别 8.0版本
select @@global.transaction_isolation;
#设置当前会话隔离级别
set session transaction isolation level read uncommitted #读未提交
/ read committed #读已提交
/ repeatable read #可重复读
/ serializable #可串行化
#设置系统隔离级别
set global transaction isolation level read uncommitted #读未提交
/ read committed #读已提交
/ repeatable read #可重复读
/ serializable #可串行化
系统默认是 repeatable read 一般情况下,没有特殊要求,
没有必要修改(该级别可以满足绝大部分项目需求)
修改系统默认隔离级别
在my.ini文件的[mysqld]下面设置后重启服务:
#READ-UNCOMMITTED,READ-COMMITTED,SERIALIZABLE
transaction-isolation = REPEATABLE-READ[你需要设置的级别]
MySQL事务的ACID四大特性:
- 原子性(Atomicity): 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态
- 隔离性(Isolation):事物的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。