mysql
2018-01-05 13:38:47 0 举报
AI智能生成
asd
作者其他创作
大纲/内容
mysql
myisam
innodb
Berkeley
支持事务
一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。用了事务,就不可避免的要牺牲一部分速度,来保证数据的正确性。
1、事务的原子性一组事务,要么成功;要么撤回。2、稳定性有非法数据(外键约束之类),事务撤回。3、隔离性事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。4、可靠性软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候吧事务保存到日志里。开启事务START TRANSACTION 或 BEGIN提交事务(关闭事务)COMMIT放弃事务(关闭事务)ROLLBACK折返点SAVEPOINT adqoo_1ROLLBACK TO SAVEPOINT adqoo_1发生在折返点 adqoo_1 之前的事务被提交,之后的被忽略事务的终止设置“自动提交”模式SET AUTOCOMMIT = 0每条SQL都是同一个事务的不同命令,之间由 COMMIT 或 ROLLBACK隔开掉线后,没有 COMMIT 的事务都被放弃事务锁定模式系统默认: 不需要等待某事务结束,可直接查询到结果,但不能再进行修改、删除。缺点:查询到的结果,可能是已经过期的。优点:不需要等待某事务结束,可直接查询到结果。
事务的隔离用是通过锁机制实现的,不同于MyISAM使用表级别的锁,InnoDB采用更细粒度的行级别锁,提高了数据表的性能。InnoDB的锁通过锁定索引来实现,如果查询条件中有主键则锁定主键,如果有索引则先锁定对应索引然后再锁定对应的主键(可能造成死锁),如果连索引都没有则会锁定整个数据表
页级锁(BDB引擎
在Innodb引擎中既支持行锁也支持表锁,那么什么时候会锁住整张表,什么时候或只锁住一行呢?InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
共享锁与排他锁(写)
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。用法SELECT ... LOCK IN SHARE MODE;
排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。用法SELECT ... FOR UPDATE;
0 条评论
回复 删除
下一页