트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel

mysql 2018.12.18 14:39


--


Transcation


select @@autocommit;


set autocommit = false;


create database sampleDB;


create table BusinessCard(Name varchar(255), Address varchar(255), Telephone varchar(255));


insert into BusinessCard values ('Bob', 'Seocho-dong 123', '123-4567');


commit;


rollback;


--


Lock


select engine, support from information_schema.engines where support='DEFAULT';


set default_storage_engine = InnoDb;

set default_storage_engine = MyISAM;


select engine from information_schema.tables where table_name = 'city' and table_schema='world';


alter table 'city' engine = InnoDB;


--


Isolation level


select @@tx_isolation;


set tx_isolation = 'READ-COMMITED';


commit;


--


트랜잭션의 격리수준 Transcation IsolationLevel


ACID ( Atomicity / Consistency / Isolation / Durability )

- 원자성 Atomicity : All or Nothing, Commit / Rollback

- 일관성 Consistency : 트랜잭션 전후에 데이터가 손상을 받으면 안됨, 같은 데이터가 다른 값을 가지면 안됨

- 고립성/격리수준 Isolation : 여러 개의 트랜잭션이 수행될 때 성능과 데이터 안정성간의 trade-off

- 지속성 Durability : 트랜잭션이 종료된 이후에도 데이터에 문제가 없어야 됨


Read Uncommitted

- 트랜잭션이 종료되지 않는 상태의 대상 데이터를 읽어가는 것

- 트랜잭션이 처리되는 도중에 다른 트랜잭션이 해당 데이터를 읽기를 허용 ( uncommitted date )

- 트랜잭션이 종료되면 데이터 값이 변경 될 수 있음

- 예를 들면 개표가 진행 중인 득표 현황으로 현재 값을 참고하지만 최종 값은 변경 될 수 있음

- 성능은 높지만 데이터의 안정성이 떨어짐


Read Committed

- 트랜잭션이 종료 된 상태의 데이터만 읽는 것 ( committed data )

- 오라클이나 일반적인 DBMS 의 기본 격리수준

- 현재 트랜잭션이 진행되면서 데이터를 참고할 때 다른 트랜잭션에서는 작업이 종료된 데이터만을 읽는 다는 것

- 이 경우 트랜잭션에서 동일한 쿼리는 여러 번 수행시킬 때 쿼리 값이 달라지는 경우가 생길 수 있음

- 이 경우를 해결해 주는 것이 Repeatable Read


Repeatable Read

- 트랜잭션이 진행되는 도중에는 쿼리를 반복 수행하더라도 결과 값은 계속 동일

- 즉, 데이터가 캐싱/버퍼링 됨

- DB 백업 시간이 오래 걸릴 경우 백업이 진행되는 도중에는 데이터가 수정되어도 백업 시작 시점의 데이터를 백업하도록 함

- 다른 트랜잭션이 업데이트하는 것은 금지하지만 레코드 추가하는 것은 허용하는 방식

- MariaDB 의 기본 격리 수준


Serializable

- 트랜잭션끼리 겹치는 일이 발생하지 않음

- 트랜잭션이 동시에 수행되는 것이 금지되고 순차적으로 수행됨

- 대신 성능이 가장 낮음, 안정성은 높음


CAP ( Consistency / Availability / Partition Tolerance )







Trackbacks 0 : Comments 0

Write a comment


파티셔닝 Partitioning

mysql 2018.12.17 14:51


create table BusinessCard

(id int not null, name varchar(255), address varchar(255), telephone varchar(255), createtime date)

  partition by range(year(createtime))(

  partition p0 values less than (2013),

  partition p1 values less than (2014),

  partition p2 values less than (2015),

  partition p3 values less than MAXVALUE

);


show create table BusinessCard\G


insert into BusinessCard values (1, 'kim','seoul',' 123-456', '2000-01-01');

insert into BusinessCard values (2, 'lee','seoul',' 123-456', '2014-01-01');


explain partitions select * from BusinessCard where createtime >= '2014-01-01' \G


파티션 추가/삭제

alter table BusinessCard add partition(

   partition p4 values less than (2005));


alter table BusinessCard drop partition p4;


파티션 분할/병합

alter table BusinessCard

 reorganize partition p3 into (

 partition p3 values less than(2015), 

 partition p4 values less than MAXVALUE

);


alter table BusinessCard

 reorganize partition p2, p3 into (

 partition p23 values less than (2014));




Trackbacks 0 : Comments 0

Write a comment


mysql dbdriver call store procedure in codeigniter(ci)

php 2018.12.17 14:19

mysql dbdriver call store procedure in codeigniter(ci)




<!-- php -->


$sql = "CALL .sp(@out1);";


$this->db->query($sql);            


$query = $this->db->query("SELECT @out1");




$result_temp = array();




if($query->num_rows() > 0)


$result_temp = $query->result_array();








<!-- mysql -->


CREATE DEFINER=`id`@`ip` PROCEDURE `sp`( 


OUT `last_id` INT


)


BEGIN




SET last_id = "test";




END$$




DELIMITER ;






<!-- codeigniter system/database/DB_active_rec.php -->




/**


* "Count All Results" query


*


* Generates a platform-specific query string that counts all records


* returned by an Active Record query.


*


* @param string


* @return string


*/


public function count_all_results($table = '')


{


if ($table != '')


{


$this->_track_aliases($table);


$this->from($table);


}




$sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows'));




$query = $this->query($sql);


 


$result_temp = $query->result();




$array_temp = json_decode(json_encode($result_temp[0]), True);




$this->_reset_select();




if ($array_temp["numrows"] == 0)


{


return 0;


}




return (int) $array_temp["numrows"];


}



Trackbacks 0 : Comments 0

Write a comment