数据库事务隔离性

1.事务传播在方法之间的传播
2.嵌套事务
嵌套情况:
B需要事务,A没有开启事务,B中新开启一个事务,否则使用A中的旧事物
B可以支持当前事务,A当前没有事务,B就以非事务方式执行
B必须在事务中运行,如果当前事务不存在,则会抛出异常
B不支持事务,A中存在事务,B抛出异常
B方法不支持事务,如果执行B时,A存在事务,A中的事务会被挂起
B嵌套事务:如果A中有事务,那么B开启一个嵌套事务,否则和第一种方法一致
B支持总是开启新事物:如果A存在事务,则A的这个事务会被‘挂起’

3.事务隔离:

ANSI/ISO SQL标准按由弱到强,一次定义了4事务隔离级别:未提交读,提交读,重复读,串行读

对于不同的事务,采用不同的隔离级别分别有不同的结果、不同的隔离级别有不同的现象,主要有以下3种:

脏读:一个事物可以读取另一个尚未提交事务的修改数据

非重复读:在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了,,也可能被删除了

幻象读:在同一个事务中,同一查询多次进行的时候,由于其他插入操作的事务提交,导致每次返回的结果集不同

不同隔离级别有不同的现象,所有数据库基本都是通过不同的锁定/并发机智实现,隔离级别越高,数据库的并发性就越差,4种食物隔离级别表现的现象表:

read uncommitted :隔离级别 脏读、非重复读、幻想读

   readcommitted:重复读、想读

  repeatable read :  幻想读

  serializable:无

mysql默认的事务隔离是repeatable read ,但是它不会幻读

oracle 默认是read commited


4.开启事务与autocommiit的关系 :

mysql的每一个session里面,默认autocommit的值是1,表示每一个数据库DML语句执行之后,都自动提交,如果在绘话里执行了start transaction 或者begin语句,那么将会‘暂挂’autocommit,直到start transaction遇到现实commit或者rollback

注:set autocommit=0语句不会提交语句之前的DML语句,但是set autocommit=1会提交语句之前的DML语句

doctrine的解决方法:函数第一行用一个_transactionNestingLevel来标识当前嵌套的级别,如果是1,也就是还没有嵌套,那就用默认的方法执行下一行Start Transaction就ok了,如果大于1,也就是有嵌套的时候,它会帮我们创建一个savepoint ,这个savepoint就可以理解为一个事务记录点,当需要回滚的时候只可以回滚到这个点,然后看下rollBack函数


5.laravel框架的解决方案:
开启事务:
public function beginTransaction(){
$this->transactions;
if($this->transaction == 1){
$this->pdo->beginTranaction();
}
}
提交事务:
public function commit()
{
if($this->transaction == 1){
$this->pdo->commit();
}
$this->transactions;
}
回滚事务:
public function rollBack(){
if($this->transactions == 1){
$this->transactions == 0;
$this->pdo->rollBack();
}else{
$this->tansactions;
}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值