事务:事务是“数据库”中的一个概念,指业务处理中的“一个业务”对应数据库中多部的操作。
事务_MySQL中的事务处理:
a> MySQL中默认的事务处理方式:自动提交--将每条sql语句都看作是一个独立的事务,执行后会立即更改数据哭,与其他sql语句没有关联,不能满足对事务处理的需求
b> 查看当前mysql的事务处理方式:
show variables like 'autocommit';
c> mysql中处理事务方式有两种
1> 关闭自动提交,变为“手动提交”
set autocommit =off
执行sql语句
提交/回滚
commit或者rollback
注:当提交或者回滚后,之前所有的sql语句被全部处理,要么全部更改到数据库,要么全部取消之后再写新的sql语句,就是新的事务了
一旦提交后不能再回滚了;一旦被回滚后,就不能再提交了。
2> 在“自动提交”状态下,临时开启一个“手动事务”
start transaction 开启一个临时事务
sql语句
提交或者回滚
注意:只要提交或者回滚,这个事务就结束了,立即恢复到之前的自动事务状态,
事务对于MySQL是会话级别的,每个会话都可以单独设置事务处理,互不影响,互相隔离
在一个会话中查询结果是可以查到之前的修改的结果的,不论提交/回滚
但在另外一个会话中,不能读取到一个事务未提交的数据(mysql的默认隔离级别).事务_事务的特性:
1.原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(Consistency)事务前后数据的完整性必须保持一致。
3.隔离性(Isolation)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
4.持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
事务_如果不考虑两个事务的隔离性会产生的问题:
1.脏读:一个事务读到了另一个事务未提交的数据.
2.不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。
3.虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。
事务_事务的隔离级别:
1).在数据库端,可以通过"设置事务的隔离级别"来决定两个事务的相互影响程度:
2).四个隔离级别:
1).read uncommitted:读未提交;最低级;基本上不隔离。可以读到脏数据。
2).read committed:读已提交;可以解决脏读,但不能解决"不可重复读"和"幻读";
3).repeatable read: 可重复读。在MYSQL下可以解决:脏读、不可重复的、幻读;(MySQL的默认级别)
4).serializable :将两个事务完全隔离,一个事务未结束时,另一个事务必须等待;
3).查看当前数据库的隔离级别:
select @@tx_isolation;
4).设置会话的事务隔离级别:
set session transaction isolation level 上面的四个隔离级别之一;
5).安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
6).常见数据库的默认隔离级别:
MySql:repeatable read(第三级)
Oracle:read committed(第二级)