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