一、什么是事务:
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部执行成功,要不全部不成功。MySQL默认自带事务,
但是MySQL自带的事务是一条语句独占一个事务,如果想多条sql放在一个事务中执行,则需要使用数据库事务的命令:
二、数据库事务的命令:
① start transaction 开启事务
② rollback 回滚事务,取消这个事务
③ commit 提交事务
三、事务的四大特性(ACID):
1、原子性(Atomicity):事务是一组不可分割的单位,要么同时成功要么同时不成功。
2、一致性(Consistency):事务前后的数据完整性应该保持一致。(数据库的完整性:如果数据库在某个时间点下,所有
数据都符合所有的约束,则称数据库为符合完整性的状态)
3、隔离性(Isolation):事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多
个并发事务之间数据要相互隔离。
4、持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久的,无法再回滚,且接下来
即使数据库发生故障也不会对其有任何影响。
四、事务的四大隔离级别:
本质就是多个线程操作同一个资源造成的多线程并发安全问题,加锁可以非常完美的保证隔离性,但是这会造成数据库性
能大大的下降。根据实际情况分三种类型
1、如果两个事务并发修改:必须隔离;
2、如果两个事务并发查询:不用隔离;
3、如果一个事务修改,另一个事务查询:会出现以下三种情况
① 脏读:一个事务读取到另一个事务未提交的数据(本质是事务之间不隔离);
② 不可重复读:一个事务多次读取同一条记录,读取结果不相同(本质是一个事务读取到另一个事务已经提交的数据,事
务查询不加行锁);
③ 虚读/幻读:一个事务多次查询整表的数据,由于其他新增或删除记录造成多次查询出的记录条数不同(本质一个事务
读取到另一个事务已经提交的数据,事务查询不加表锁);
因此,对于以上三种分类数据库给事务设置了四种隔离级别:
1、read uncommitted:不做任何隔离,具有脏读、不可重复读、虚读(幻读)问题;
2、read committed:可以防止脏读,不能防止不可重复读、虚读(幻读)问题;
3、Repeatable read:可以防止脏读、不可重复读,不能防止虚读(幻读)问题;
4、serializable:数据库运行在串行化模式下,所有问题都没有,但性能最差。
#补充:
① MySQL默认事务隔离级别为Repeatable read;
② 隔离级别安全性比较:
serializable>Repeatable read>read committed>read uncommitted
③ 隔离级别性能比较:
serializable<Repeatable read<read committed<read uncommitted
④ 使用数据库的时候,根据自己想要防止的问题,选择一个能够防止问题的隔离级别中性能尽量高的一个;
⑤ 修改当前隔离级别:
set [session/global] transaction isolation level 隔离级别;
⑥ 查询当前数据库隔离级别:
select @@tx_isolation;