12 事务
Posted deepsealin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12 事务相关的知识,希望对你有一定的参考价值。
1.事务的概念
指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功
mysql 默认自带事务,但是 mysql 自带的事务是一条语句独占一个事务
我们也可以自己来控制事务:
start transaction; --开启事务,这条语句之后的sql将处于同一事务中,并不会立即影响到数据库
...
...
commit; -- 提交事务,让这个事务中的sql对数据库的影响立即发生。
rollback; -- 回滚事务,取消这个事务,这个事务不会对数据库的数据产生影响了。
2.事务的四大特性 ACID
○ 原子性 事务是一组不可分割的单位,要么同时成功,要么不成功
○ 一致性 事务前后的数据完整性应该保持一致。(如果数据库在某个时间点下,所有的数据都符合所有的约束,则称数据库为符合完整性的状态)
○ 隔离性 多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间数据要相互隔离
○ 持久性 持久性是指一个事务一旦被提交,它对数据库数据的改变是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
隔离性:本质是多个线程操作同一个资源造成的多线程并发安全问题。
● 加锁可以保证隔离性,但会造成数据库的性能问题。
● 如果两个事务并发的修改:必须隔离开!
● 如果两个事务并发的查询:不用隔离
● 如果一个事务修改,另一个事务查询:
脏读:一个事务读取到另一个事务未提交的数据
不可重复读: 一个事务多次读取同一条记录,读取的结果不同(一个事务读取到另一个事务已经提交的数据)
虚读:一个事务多次查询整表的数据,由于其他事务新增(删除)记录造成多次查询出的记录条数不同
四大隔离级别 -- 四个选项数据库的使用者可以控制数据库工作在哪个级别下,可防止不同的隔离性问题。
read uncommitted -- 不作任何隔离,具有上述三种问题
read committed -- 可以防止脏读
repeatable read -- 可以防止脏读、不可重复读 (mysql 默认是这个级别)
serializable -- 数据库运行在串行化模式下, 所有问题都没有,但性能很低
修改隔离级别 -- set session/global transaction isolation level 隔离级别;
查询当前数据库的隔离级别 -- select @@tx_isolation;
以上是关于12 事务的主要内容,如果未能解决你的问题,请参考以下文章