事务的定义:
当一组sql语句放在同一批次中去执行,如果其中有一个sql语句出错,那么该批次内的所有sql都将被取消执行。
事务有四个特性:
1.原子性:工作单元中所有操作要么都成功,要么都不成功,不会出现部分成功的情况
2.一致性:工作完成其结果应该与预期一致,例如账户A向账户B转账的事务,如果该事务执行成功必须要保证账户A 转出多少,账户B转入相同的数,如果事务失败,那么转账失败。
3.隔离性:还可以被称为并发控制,可串行化,锁等。事务中所有操作的数据要隔离起来,以防止其他用户访问这些数据而带来的不一致情况。
4.持久性:事务一旦提交,所做的修改就会永久保存到数据库中,即使数据库发生故障也不会有任何影响。(故障不包括硬盘损坏等)
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交 | 是 | 是 | 是 |
不可重复读 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行化 | 否 | 否 | 否 |
事务的注意事项:
1.存储过程的执行begin会开启一个事务,end结束会隐式提交一次
2.不要在事务的中途进行提交操作,不仅会破坏事务的原子性,还会使事务结束
3.由于DDL或DCL操作会创建新的事务,这会导致前面的操作隐式提交,从而破坏事务的原子性,尽量不要在过程中使用DDL或DCL语句
事务的操作:
1.关闭自动提交:set autocommit=0;
2.开启事务:start transcation;
3.一组sql语句
4.提交事务:commit
5.回滚事务:rollback
6.事务结束:end transaction
7.开启原来自动提交:set autocommit=1;
脏读:
首先脏读又被称为无效数据的读出,是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,所以另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能不正确。总结就是事务A读到了事务B未提交的数据。
注:脏读一般是针对update操作。
幻读:
是指当事务不是独立执行时发生的一种现象,当第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部数据行,此时第二个事务也在修改这个表中的数据,这种修改是向表中插入一行新数据,那么就会发生操作第一个事务的用户发现还有没有修改的数据行,跟出现了幻觉一样。
注:幻读一般是针对insert或delete操作同样的条件,第一次和第二次读出来的数据不一样。
不可重复读:
是指在一个事务内,多次读同一个数据。在一个事务还没有结束的时候,另外一个事务也访问该同一数据,那么在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据不一样,所以称为不可重复读。
注:不可重复读一般是针对update操作。