MySQL的事务与锁-创新互联
MySQL事物的实现需要依赖数据库提供的锁。
专注于为中小企业提供成都网站设计、成都网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业田林免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。MySQL的事务MySQL支持MyISAM存储引擎、Memory存储引擎、InnoDB存储引擎,其中只有InnoDB存储引擎支持事务。
事务简介 事务的定义数据库的事务由一组DML语句组成,即insert、update、delete。通过事务可以保证数据库中数据的完整性,保证这一组DML操作要么全部执行,要么全部不执行。因此,可以把事务看成是一个逻辑工作单元,可以通过提交或回滚操作来结束一个事务。当事务被成功提交给数据库时,事务会保证其中所有操作都成功完成且结果被永久保存在数据库中;如果有部分操作没有成功完成,事务中的所欲操作都需要被执行回滚,数据则回到事务执行前的状态。
事务的特性Atomicity
:原子性。事务中的所有DML操作,要么全部执行成功,要么全部执行失败,不会存在一部分执行成功,一部风执行失败的的情况。事务在执行过程中发生错误,操作的数据会被回滚到事务开始前的状态。
Consistency
:一致性。事务在开始执行前后执行结束后,数据库中数据的完整性没有被破坏。
Isolation
:隔离性。数据库支持并发操作,允许多个客户端或多个事务同时操作数据库中的数据。隔离性能够防止各事务并发执行时由于交叉执行而导致的数据不一致。
Durability
:持久性。当事务成功执行结束后,事务对数据库的修改是永久性的。数据不会因为系统故障而丢失。
通过事务控制语句可以开启一个事务、提交一个事务和回滚一个事务。MySQL同时还提供了保存点的机制,以方便在执行事务发生错误的时候,可以控制事务回滚的位置。
使用事务控制语句事物的控制语句 | 作用 |
---|---|
begin或start transaction | 二者都是显式开启一个事务 |
commit或commit work | 二者都是提交事务,是已对数据库进行的所有修改成为永久性的 |
rollback或rollback work | 二者都是回滚事务,并撤销已经修改但未提交的所有操作 |
savepoint [保存点名称] | 在事务中创建一个保存点,一个事务中可以有多个保存点 |
rollback to [保存点名称] | 回滚事务到指定保存点 |
releasesavepoint [保存点名称] | 删除事务中的保存点 |
set transaction | 设置事务的隔离级别 |
数据库允许多个客户端同时访问,当这些客户端并发访问数据库中的同一部分数据时,如果没有采取必要的隔离措施就容易造成并发一致性问题,从而破坏数据的完整性。
MySQL事物的隔离级别事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
可序列化读 | × | × | × |
一个事务读取到了另一个事务还未提交的数据。
事务的不可重复读指在同一个事务中,前后两次读取的数据结果不一致。
MySQL的锁MySQL采用锁的机制来解决并发一致性问题,从而保证事务的隔离性。当一个事务在进行操作时会对操作的数据进行加锁,从而限制另一个事务的操作。
InnoDB锁的类型InnoDB存储引擎支持行级锁和表级锁,默认采用行级锁。
行级锁- 共享锁:也叫读锁,同一个数据对象上可以有多把共享锁,如果一个事务在数据对象上加了共享锁,则该事务可以读取数据,但不能修改,其他事务可以在该数据对象上继续添加共享锁。
- 排它锁:也叫写锁,同一个数据对象上只能有一把排它锁,获取到数据排它锁的事务可以读取和修改数据。
表级锁查询语句select默认不会加任何类型锁,因此当数据上有了排他锁,还是可以通过查询语句select获取到数据。
- 意向共享锁(IS):事务在给数据添加行级共享锁之前,必须先取得该表的意向共享锁。
- 意向排他锁(IX):事务在给数据添加行级排他锁之前,必须先取得该表的意向排他锁。
InnoDB的锁机制意向锁是InnoDB存储引擎自维护的,用户无法手动操作。
InnoDB的行锁是通过索引实现的,因此只有通过索引查询数据时,InnoDB才会使用行级锁。
死锁MySQL的行级锁是针对索引加的锁,不是针对表中的行加级锁。虽然是访问不同行的记录,但如果表中不存在对应的索引,或者使用了不同的索引,就会造成锁的冲突而锁住整张表。
死锁是指两个或两个以上的事务在执行过程中,因为互相等待或者因为争夺相同的资源而造成的互相等待的现象。
避免死锁- 以固定的方式访问表和行。
- 大事务拆小。
- 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
- 降低隔离级别。
- 为表添加合理的索引。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
分享文章:MySQL的事务与锁-创新互联
标题URL:http://scyanting.com/article/dipsce.html