文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SQL之Mysql事务的概念与应用

2014-05-05 14:15

关注

SQL之Mysql事务的概念与应用

代码分享:https://github.com/mtdgclub/PDO

具体查看根目录下的pdoAffair.php文件代码

2. 事务的四大特性

原子性是基础,隔离性是手段,持久性是目的,真正的老大就是一致性。

3. 三类数据读问题

3.1 Dirty Read(脏读)

事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。

3.2 Unrepeatable Read(不可重复读)

事务 A 读取了事务 B 已提交的更改数据。

3.3 Phantom Read(幻读)

事务 A 读取了事务 B 已提交的新增数据。

3.4 不可重复读和幻读的区别

4.两类数据更新问题

4.1 第一类丢失更新(撤销覆盖)

A事务撤销时,把已经提交的B事务的更新数据覆盖了。

4.2 第二类丢失更新(提交覆盖)

B事务覆盖A事务已经提交的数据,造成A事务所做操作丢失

5.隔离的级别

5.1 MySQL

mysql默认的事务处理级别是"REPEATABLE-READ",也就是可重复读

select @@tx_isolation;

select @@global.tx_isolation;

set session transaction isolatin level repeatable read;

set global transaction isolation level repeatable read;

5.2 Oracle

oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。默认系统事务隔离级别是READ COMMITTED,也就是读已提交。

--首先创建一个事务

declare

     trans_id Varchar2(100);

  begin

     trans_id := dbms_transaction.local_transaction_id( TRUE );

  end; 

--查看事务隔离级别

SELECT s.sid, s.serial#,

CASE BITAND(t.flag, POWER(2, 28))

WHEN 0 THEN "READ COMMITTED"

ELSE "SERIALIZABLE"

END AS isolation_level

FROM v$transaction t

JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context("USERENV", "SID");

6.事务实现步骤

归纳以下几点重要步骤:

$mysqli->autocommit(false);

$mysqli->savepoint a;

$mysqli->rollback();

$mysqli->commit();

7.实战事务回滚案例

7.1 数据库结构

CREATE TABLE `t_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(255) DEFAULT NULL,

  `mobile` varchar(13) NOT NULL,

  `password` varchar(255) NOT NULL,

  PRIMARY KEY (`id`),

  KEY `FindUserId` (`mobile`,`password`)

) ENGINE=MyISAM AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;

7.2 案例代码实战


//创建一个mysqli对象
$mysqli = new MySQLi("localhost", "root", "root");
$mysqli->select_db("myyaf");
//判断是否链接成功
if ($mysqli->connect_error) {
    die($mysqli->connect_error);
}
//由于在事务提交中系统默认提交,故这里设置为FALSE先不提交
$mysqli->autocommit(false);
//其实这里系统已经相当在这里做个保存点,记录此时所有状态,回滚是回滚到这里
$mysqli->savepoint("a");
//写出对数据库的操作语句
for ($i = 0; $i <= 30; $i++) {

    $sql = ".....";
    //执行sql语句
    $res = $mysqli->query($sql) or die ($mysqli->error."
".$sql);

    //判断是否都执行成功
    if ($res) {
        //只要有一条失败便回滚,都不执行,若设置滚回点,如a,则回滚到a处
        $mysqli->rollback();
    } else {
        //一旦提交无法回滚,成功则提交
        $mysqli->commit();
    }
}
//关闭资源
$mysqli->close();

8.总结

对于数据库的事务,其实当你能够理解事务的概念,再结合实际应用场景,就能很好地使用,一般来说,一些对数据高严谨的程序都会使用事务来执行CURD操作。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯