标签:tab 事务 事务隔离级别 影响 oracl 功能 rac abi mon
#TCL语言 /* transaction control language事务控制语言 事务: 一个或者一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 案例:转账,张三丰向郭襄转账500 张三丰 1000 郭襄 1000 update 表 set 张三丰的余额=500 where name="张三丰" 再上面执行完之后,数据库挂了,咋解决:这里面涉及事物机制 update 表 set 郭襄的余额=1500 where name="郭襄" 整个单独单元作为一个不可分割的获赠提,如果单元中某条sql语句一旦执行失败或者产合适呢个错误, 整个单元将会回滚(撤销之前的所有操作)。所有受到影响的数据将返回到事物开始前的状态;如果单元中的所有sql语句均执行成功,则事物被顺利执行。 存储引擎:在mysql中的数据用各种不同的技术存储在文件(内存)中。 show engines; 事物的ACID属性 1.原子性atomicity:事务:不可再分的工作单元 2.一致性consistency:一个状态转为另外一状态的总和时不变的 3.隔离性isolation:事务之间应该时隔离的(但是需要看隔离级别) 4.持久性durability:事务一旦被提交,就是永久性的 事务的创建 隐式事务:事务没有明显的开启和结束的标记 比如insert,update,delete语句 delete from 表 where id=1; #查看事务开启状态 show variables like "autocommit"; 显式事务:事务具有明显的开启和结束的标记 前提:必须设置自动提交功能为禁用 set autocommit=0; 步骤1:开启事务 set autocommit=0; start transaction;可选或者 begin 步骤2:编写事务中的sql语句(select,insert,update,delete) 语句1; 语句2; 。。。 步骤3:结束事务 commit;提交shiwu rollback;回滚事务 */ use test; create table money( id int primary key, name varchar(20), balance int); desc money; insert into money values(1,"张三丰",1000); insert into money values(2,"郭襄",1000); select * from money; #演示事务的创建步骤 #1.开启事务 set autocommit=0; start transaction; #2.编写事务中的sql语句 update money set balance = 500 where name="张三丰"; update money set balance = 1500 where name="郭襄"; #3.结束事务 commit;#提交 select * from money; #演示下回滚 #1.开启事务 set autocommit=0; start transaction; #2.编写事务中的sql语句 update money set balance = 1000 where name="张三丰"; update money set balance = 1000 where name="郭襄"; #3.结束事务 rollback;#回滚,结果仍然是500,1500没有更改 select * from money; 数据库的隔离级别 运行多个事务,如果没有采用必要的隔离机制,会导致各种并发问题: 1.脏读,对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时且无效的 2.不可重复读:再次读取,值会改变 3.幻读:插入问题 数据库支持4种隔离级别 1.read uncommited(读未提交数据) 2.read commited(读已提交数据) 3.repeatable read(可重复读) 4.serializable(串行化) oracle支持2种事务隔离级别:read commited(读已提交数据),serializable(串行化),默认read commited(读已提交数据) mysql支持4种,默认为repeatable read(可重复读)
标签:tab 事务 事务隔离级别 影响 oracl 功能 rac abi mon
原文地址:https://www.cnblogs.com/ivyharding/p/11575165.html