事务
什么是事务?
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功,从而确保了数据的准确安全。
MYSQL中如何使用事务?
1.在MySQL中的每一条语句都是属于独立的事务,myaql中的事务是自动开启的,每一个数据厂商不一样,oracal中就不是
2.在mysql中手动开启事务,使用的是 start transaction 在此之后的语句都会处于同一个事务之中;
事务的特性:
原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生;
一致性:事务必须是数据从一个一致性状态变换到另外一个一致状态;
隔离性:事务的隔离性从一个一致性变换到另外一个一致性状态
持久性:持久性是指一个事务一旦被提交了,它对数据的改变就是永久的,接下来即使数据库发生了故障也不应该对其有任何影响;
总结事务的特性:原子性 隔离性 永久性 一致性
隔离性:如果没有隔离性,那么线程之间就会出现干扰
如果不考虑隔离级别,会出现以下的情况:-->下面的是错误的现象
脏读:一个线程中的事务读到了另外一个线程中未提交的数据
不可重复读:一个线程中的事务读到了另外一个线程中已经提交的update的数据(前后内容不一样)
虚读(幻读):一个线程中的事务读到了另外一个线程已经提交的insert的数据(前后条数不一样)
针对这三种情况 mysql提供了三种隔离级别:
Serialiable:可避免脏读,不可重复读,虚读情况的发生 最高
Repeatable read:可避免脏读,不可避免重复读情况的发生,但是不能避免的是虚读或者幻读情况的发生 第二
Read committed:可以避免脏读情况的发生;
Read unconnitted:级别最低,以上情况均无法保证 级别最低
设置MySQL的默认隔离级别是:REPEATABLE READ 这个是可重复读 他可以避免的是脏读和不可重复读;
查询当前使用的隔离级别:select @@tx_islation select @@tx_islation select @@tx_islation;
设置MySQL事务的格力级别:set session transaction isolation level xxx;(设置当前事务的,并不是永久改变的;)
注意的是:修改mysql事务的隔离级别,必须在开启事务之前,否则是无效的;