zoukankan      html  css  js  c++  java
  • 事务

    事务(Transaction)
    	一个事务是一个完整的业务逻辑单元,不可再分
    	如:银行账户转账,从A账户向B账户转账10000,需要执行两条update语句:
    		update t_act set balance=balance-10000 where actno='act_001';
    		update t_act set balance=balance+10000 where actno='act_002';
    	以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败
    	要想保证以上两条DML语句同时成功或同时失败,就需要使用数据库的‘事务机制’
    	
    	和事务相关的语句只有:DML语句(insert delete update)
    	why?
    		因为它们三个语句都是和数据库表当中的‘数据’相关的,事务的存在是为了保证数据的完整性、安全性
    	事务特性:(ACID)
    		A:原子性	事务是最小的工作单元,不可再分
    		B:一致性	事务必须保证多余的DML语句同时成功或同时失败
    		C:隔离性	事务A与事务B之间具有隔离
    		D:持久性	说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束
    	事务间的隔离性:
    		事务隔离性存在隔离级别,理论上隔离级别包括4个:
    			第一级别:读未提交(read uncommitted) 
    					//对方事务还没有提交,我们当前事务可以读取到对方未提交的数据
    					  读未提交存在脏读(Dirty read)现象:表示读到了脏的数据
    			第二级别:读已提交(read committed)
    					//对方事务提交后的数据我方可以读取到
    					  这种隔离级别解决了脏读现象
    					  读已提交存在的问题是:不可重复读
    			第三级别:可重复读(repeatable read)
    					//这种隔离级别解决了不可重复读问题
    					  这种隔离级别存在的问题是:读取到的数据是幻象
    			第四级别:序列化读/串行化读(serializable)
    					//解决了所有问题
    					  效率低,需要事务排队
    			MySQL数据库默认的隔离级别是:可重复读
    	
    	演示事务
    		*MySQL事务默认情况下是自动提交的(只要执行任意一条DML语句则提交一次)
    			关闭自动提交:start transaction;
    	案例:
    		准备表:
    			drop table if exists t_user;
    			create table t_user(
    				id int primary key auto_increment,
    				username varchar(255)
    			);
    		演示:
    			1.MySQL中的事务是自动提交的,只要执行一条DML语句则提交一次
    				insert into t_user(username) values('zs');
    				select *from t_user;
    				+----+----------+
    				| id | username |
    				+----+----------+
    				|  1 | zs       |
    				+----+----------+
    				rollback;
    				select *from t_user;
    				+----+----------+
    				| id | username |
    				+----+----------+
    				|  1 | zs       |
    				+----+----------+
    			2.使用start transaction关闭自动提交
    				start transaction;
    				insert into t_user(username) values('lisi');
    				select *from t_user;
    				+----+----------+
    				| id | username |
    				+----+----------+
    				|  1 | zs       |
    				|  2 | lisi     |
    				insert into t_user(username) values('wangwu');
    				rollback;
    				select *from t_user;
    				+----+----------+
    				| id | username |
    				+----+----------+
    				|  1 | zs       |
    				+----+----------+
    		使用两个事务演示隔离级别:
    			1.演示read uncommitted
    				设置事务的隔离级别:
    					mysql> set global transaction isolation level read uncommitted;
    					查看事务的全局隔离级别: select @@global.tx_isolation;
    			2.演示read committed
    			3.演示repeatable read
    			4.演示串行化读(serializable)
    				
    

      

  • 相关阅读:
    DataWindow修改的单元格文字颜色改变
    DataWindow奇偶行颜色显示不同
    Retrieve时不清除DataWindow原有数据
    Camera拍照声设定
    使用Log.isLoggable方法
    Android Audio遇到播放无声时的分析
    耳机jack构造及在应用时可能出现的问题
    【Android】使用persist属性来调用脚本文件
    [Android][Audio] audio_policy.conf文件分析
    Android4.4 耳机检测分析
  • 原文地址:https://www.cnblogs.com/-slz-2/p/15428837.html
Copyright © 2011-2022 走看看