MySQL数据库技术与项目应用-MySQL维护网上商城系统的安全性_第1页
MySQL数据库技术与项目应用-MySQL维护网上商城系统的安全性_第2页
MySQL数据库技术与项目应用-MySQL维护网上商城系统的安全性_第3页
MySQL数据库技术与项目应用-MySQL维护网上商城系统的安全性_第4页
MySQL数据库技术与项目应用-MySQL维护网上商城系统的安全性_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

维护网上商城系统地安全性MySQL数据库技术与项目应用07引言/FOREWORD随着信息化,网络化水平地不断提升,重要数据信息地安全受到越来越大地威胁,而大量地重要数据往往都存放在数据库系统。如何保护数据库,有效防范信息泄露与篡改成为重要地安全保障目地。MySQL提供了用户认证,授权,事务与锁等机制实现与维护数据地安全,以避免用户恶意攻击或者越权访问数据库地数据对象,并能根据不同用户分配相应地访问数据库对象及数据地权限。目录/Contents0103数据库用户权限管理使用锁保证事务并发地安全性02使用事务保证数据操作地安全性任务1数据库用户权限管理MySQL是一个多用户数据库管理系统,具有功能强大地访问控制体系。本任务详细介绍了MySQL数据库用户及用户权限管理地实现,以防止不合法地使用所造成地数据泄露,更改与破坏。任务场景用户与权限数据库地安全性是指只允许合法用户进行其权限范围内地数据库有关操作,保护数据库以防止任何不合法地使用所造成地数据泄露,更改或破坏。数据库安全性措施主要涉及:用户认证问题访问权限问题MySQL用户root用户root用户是超级管理员,拥有操作MySQL数据库地所有权限。普通用户普通用户仅拥有数据库管理员赋予它地权限。用户与权限在安装MySQL时,会自动安装名为mysql地数据库。mysql数据库地user表记录了允许连接到服务器地账号信息与一些全局级地权限信息,主要分为7个类别:账号列安全连接列身份验证密码策略列资源控制列权限列用户特征数据列用户与权限user表所属类别属性名数据类型是否为空默认值字段说明账号列Hostchar(255)NO

主机地址Userchar(32)NO

用户名安全连接列ssl_typeenum('','ANY','X509','SPECIFIED')NO

保存安全类型,值为X509时表示使用该证书ssl_cipherblobNO安全加密连接地特定密码x509_issuerblobNO由CA签发有效地X509证书x509_subjectblobNO保存含主题有效地X509证书身份验证与密码策略列pluginchar(64)NO

用户验证插件。默认值为caching_sha2_passwordauthentication_stringtextYES

登录密码password_expiredenum('N','Y')NON密码过期时间用户与权限所属类别属性名数据类型是否为空默认值字段说明身份验证与密码策略列password_last_changedtimestampYES

最后修改密码时间password_lifetimesmallintunsignedYES

密码有效期Password_reuse_historysmallintunsignedYES

是否允许重用历史密码Password_reuse_timesmallintunsignedYES

密码重用时间限期Password_require_currentenum('N','Y')YES

修改密码时是否需要提供当前密码account_lockedenum('N','Y')NON用户账号锁定或解锁状态资源控制列max_questionsintunsignedNO0每小时执行查询最大次数max_updatesintunsignedNO0每小时执行更新最大次数max_connectionsintunsignedNO0每小时执行连接最大次数max_user_connectionsintunsignedNO0单个用户同时建立连接地最大数用户与权限所属类别属性名数据类型是否为空默认值字段说明权限列Select_privenum('N','Y')NON查询数据权限Insert_privenum('N','Y')NON插入数据权限Update_privenum('N','Y')NON修改现有数据权限Delete_privenum('N','Y')NON删除现有数据权限Create_privenum('N','Y')NON创建数据库与表权限Drop_privenum('N','Y')NON删除数据库与表权限Reload_privenum('N','Y')NON执行刷新与重新加载MySQL日志,权限,主机,查询与表权限Shutdown_privenum('N','Y')NON关闭MySQL服务器。将此权限提供给root账户之外地任何用户时,都应当非常谨慎Process_privenum('N','Y')NON是否可以通过SHOWPROCESSLIST命令查看其它用户地进程用户与权限所属类别属性名数据类型是否为空默认值字段说明权限列Create_role_privenum('N','Y')NON创建角色权限Drop_role_privenum('N','Y')NON删除角色权限Json列User_attributesjsonYES

用户特征用户与权限Host与User两列同组成了复合主键区分MySQL地账户,当Host地值为"%"表示对所有主机开放权限,值为localhost时,表示只允许该用户在本机登录。在身份验证列,authentication_string保存使用plugin插件算法对密码进行加密运算后地字符串。凡是以_priv结尾地列均为权限列,一有29个权限列,限于篇幅这里仅列出了11项,其余地请详见MySQL文档,权限列存储用户地全局权限,且数据类型均为ENUM型(枚举型),其取值只有N与Y两种,N表示没有权限,为保证数据库安全性,默认时权限都为N,管理者可根据实际需要为用户赋予相应地权限。用户管理账户管理包括创建用户,删除用户,密码管理等。要实现对用户账户地管理,需要有相应地操作权限。创建用户CREATEUSER[IFNOTEXISTS]账户名1[用户身份验证选项1][,账户名2[用户身份验证选项2]]...DEFAULTROLE角色名1[,角色名2...][WITH资源控制选项][密码管理选项|账户锁定选项]

用户身份验证选项:指明身份验证地插件与密码。这里仅列举两种主要格式。

角色名:MySQL8.0新增地角色管理,以方便更好地管理用户地权限。

密码管理选项:用于密码过期设置。

账户锁定选项:默认情况下创建地新用户都为解锁状态,可以设置ACCOUNTLOCK锁定用户。

资源控制选项:用于设定资源控制列地有关值。可选值有四种。用户管理例7.1创建名为user1地用户。例7.2创建名为user2地用户,只能在本机登录,密码为"123456"。例7.3创建名为user3与user4地用户,密码分别为"user333"与"user444",其user3只能从本地登录,user4可以从任意地址登录。

mysql>CREATEUSER'user2'@'localhost'IDENTIFIEDBY'123456';QueryOK,0rowsaffected(0.02sec)mysql>CREATEUSER'user1';QueryOK,0rowsaffected(0.01sec)mysql>CREATEUSER'user3'@'localhost'IDENTIFIEDBY'user333',->'user4'@'%'IDENTIFIEDBY'user444';QueryOK,0rowsaffected(0.01sec)用户管理例7.4创建名为user5地用户,使用插件为"mysql_native_password"。例7.5创建名为user6地用户,设置密码过期时间为30天。例7.6创建名为user7地用户,设置该用户一小时内最多连接服务器5次。mysql>CREATEUSER'user6'@'localhost'IDENTIFIEDBY'user666'->PASSWORDEXPIREINTERVAL30DAY;QueryOK,0rowsaffected(0.01sec)mysql>CREATEUSER'user5'@'localhost'->IDENTIFIEDWITH'mysql_native_password'BY'123456';QueryOK,0rowsaffected(0.01sec)mysql>CREATEUSER'user7'@'localhost'IDENTIFIEDBY'user777'->WITHMAX_CONNECTIONS_PER_HOUR5;QueryOK,0rowsaffected(0.05sec)用户管理修改用户密码MySQL修改密码地方式主要有ALTERUSER语句,SETPASSWORD语句与外部工具mysqladmin三种。使用ALTERUSER语句修改用户密码例7.7修改用户user1地密码为"123456"。例7.8修改当前用户密码为"123456"。ALTERUSER账户名IDENTIFIEDBY'新密码';mysql>ALTERUSER'user1'@'%'IDENTIFIEDBY'123456';QueryOK,0rowsaffected(0.00sec)mysql>ALTERUSERuser()IDENTIFIEDBY'123456';QueryOK,0rowsaffected(0.00sec)用户管理使用SETPASSWORD语句修改用户密码例7.9修改用户user1地密码为queen。

SETPASSWORD[FOR账户名]='新密码';mysql>SETPASSWORDFOR'user1'@'%'='queen';QueryOK,0rowsaffected(0.00sec)学习提示:使用SETPASSWORD语句地修改操作有可能会记录到服务器地操作日志或客户端地历史文件,有密码泄露风险,通常不建议使用。用户管理使用mysqladmin命令修改用户密码。例7.10修改用户user2地密码为"1234"。mysqladmin–u用户名[-h主机地址]–ppassword新密码mysqladmin–uuser2–ppassword123456用户管理修改用户名称使用RENAMEUSER语句可以对用户进行重命名。例7.11修改用户user1与user2地名称分别为lily与jack,lily可从任意主机登录。RENAMEUSER旧账户名1TO新账户名2[,旧账户名1TO新账户名2]…;mysql>RENAMEUSER'user1'@'%'to'lily'@'%',->'user2'@'localhost'to'Jack'@'localhost';QueryOK,0rowsaffected(0.01sec)用户管理修改用户除修改密码与用户名外,MySQL可使用ALTERUSER语句修改用户地资源限制,账户锁定状态,密码策略等属性。例7.12锁定账户'jack'@'localhost’。例7.13为账户'lily'@'%'添加资源控制,每小时该用户查询数据库次数不超过100次。。ALTERUSER[IFEXISTS]账户名1[用户身份验证选项1][,账户名2[用户身份验证选项2]]...DEFAULTROLE角色名1[,角色名2...][WITH资源控制选项][密码管理选项|账户锁定选项]mysql>ALTERUSER'jack'@'localhost'ACCOUNTLOCK;QueryOK,0rowsaffected(0.00sec)mysql>ALTERUSER'lily'@'%'WITHMAX_QUERIES_PER_HOUR100;QueryOK,0rowsaffected(0.00sec)用户管理删除用户使用DROPUSER语句可以删除一个或多个用户。例7.14删除用户user6与user7。DROPUSER[IFEXISTS]账户名1[,账户名2][,…];DROPUSERuser6@localhost,user7@localhost;学习提示:删除用户时,需要拥有数据库地全局CREATEUSER权限或DELETE权限。权限管理权限是指登录到MySQL服务器地用户,能够对数据库对象执行何种操作地规则集合。为了保证数据地安全性,数据库管理员要根据不同层级地用户进行权限分配,以限制各用户只能在所拥有地权限范围内进行数据访问。mysql数据库地权限表与权限类型表名权限层级说明格式语法user全局级保存用户被授予地全局权限ON*.*db数据库级保存用户被授予地数据库权限ON数据库名.*tables_priv表级保存用户被授予地表权限ON数据库名.表名columns_priv列级保存用户被授予地列权限ON数据库名.表名(列名1[,列名2…])procs_priv函数级保存用户被授予地存储过程与存储函数地权限EXECUTEON存储过程名|存储函数名proxies_priv代理保存用户被授予地代理权限PROXYON账户名1TO账户名2权限管理MySQL地各种权限权限类别权限名称user表地列权限级别说明数据操作权限SELECTSelect_priv全局,数据库,表,列查询数据INSERTInsert_priv全局,数据库,表,列插入数据UPDATEUpdate_priv全局,数据库,表,列更新数据DELETEDelete_priv全局,数据库,表删除数据SHOWVIEWShow_view_priv全局,数据库,表查看视图结构定义权限CREATECreate_priv全局,数据库,表创建数据库或表权限CREATEVIEWCreate_view_priv全局,数据库创建视图权限CREATEROUTINECreate_routine_priv全局,数据库创建存储过程权限CREATEROLECreate_role_priv全局,数据库创建角色地权限ALTERAlter_priv全局,数据库,表修改数据库或表等权限DROPDrop_priv全局,数据库,表删除数据库或表权限INDEXIndex_priv全局,数据库,表用索引查询表TRIGGERTrigger_priv全局,数据库,表创建与管理触发器地权限EVENTEvent_priv全局,数据库创建与管理事件权限EXECUTEExecute_priv全局,数据库执行存储过程或存储函数权限REFERENCESReferences_priv全局,数据库,表,列创建外键权限管理权限ALL[PRIVILEGES]Super_priv全局超级权限CREATEUSERCreate_user_priv全局创建用户GRANTOPTIONGrant_priv全局,数据库,表,存储过,代理允许授予用户地权限PROXYProxy_pric

与代理地用户权限相同LOCKTABLESLock_tables_priv全局,数据库确是否可以使用LOCKTABLES命令阻止对表地访问与修改SHUTDOWNShutdown_priv全局关闭MySQL服务器权限。将该权限提供给root账户之外地用户时,都应当非常谨慎。FILEFile_priv全局加载服务器主机上地文件权限管理分配权限是给特定地用户授予对象地访问权限。MySQL使用GRANT来分配权限。例7.15授予用户'lily'@'%'对数据库onlinedb所有表有SELECT,INSERT,UPDATE与DELETE地权限。GRANT权限类型1[(列列表)][,权限类型1[(列列表)]][,…n]ON{*|*.*|数据库名.*|数据库名.表名} TO账号名1[用户身份验证选项1][,账户名2[用户身份验证选项2]] [WITHGRANTOPTION]

权限类型:表示可赋予或收回地用户权限,如表7-2。

列列表:表示权限作用在哪些列上,列名间由逗号隔开,默认时表示作用于整张表。

ON子句:指出所授权限地范围。

WITHGRANTOPTION:表示在授权时可以将该用户地权限转移给其它用户。mysql>GRANTSELECT,INSERT,UPDATE,DELETEONonlinedb.*TO'lily'@'%';QueryOK,0rowsaffected(0.04sec)权限管理使用SHOWGRANTS语句查看用户权限例7.16查看用户'lily'@'%'地权限。SHOWGRANTS[FOR账户名];mysql>SHOWGRANTSFOR'lily'@'%';++|Grantsforlily@%|++|GRANTUSAGEON*.*TO`lily`@`%`||GRANTSELECT,INSERT,UPDATE,DELETEON`onlinedb`.*TO`lily`@`%`|++2rowsinset(0.01sec)权限管理例7.17授予用户'jack'@'localhost'对数据库onlinedb在goods表gname,gprice,gimage三列数据有UPDATE地权限。例7.18授予用户'jack'@'localhost',对数据库onlinedb名为"proc_getGoodsPage"存储过程地执行权限。mysql>GRANTUPDATE(gname,gprice,gimage)->ONonlinedb.goodsTO'jack'@'localhost';QueryOK,0rowsaffected(0.06sec)mysql>GRANTEXECUTEONPROCEDUREc_getGoodsPageTO'jack'@'localhost';QueryOK,0rowsaffected(0.05sec)权限管理收回权限收回权限是指取消某个用户地特定权限。例7.19收回用户'jack'@'localhost'对数据库onlinedb名为"proc_getGoodsPage"存储过程地执行权限。REVOKEpriv_type[(column_list)][,priv_type[(column_list)]][,…]ON{table|*|*.*|database.*|database.table} FROMuser[,user]priv_type:表示用户地权限类型;column_list:表示权限作用在哪些列上,列名间有逗号隔开,缺省时表示作用整张表。ON子句:指出回收权限地范围;database.table:表示用户地权限范围,即只能在指定地数据库与表上使用权限;user:表示用户地账户,同CREATEUSER语句user地释译。mysql>REVOKEEXECUTEONPROCEDUREc_getGoodsPage->FROM'jack'@'localhost';QueryOK,0rowsaffected(0.05sec)权限管理当要回收用户地所有权限时,只需要在REVOKE增加ALLPRIVILEGES关键字,其语法格式如下。例7.20收回用户'jack'@'localhost'地所有权限。例7.21刷新用户权限。

REVOKEALLPRIVILEGES,GRANTOPTIONFROM账户名1[,账户名2][,…]mysql>REVOKEALLPRIVILEGES,GRANTOPTIONFROM'jack'@'localhost';QueryOK,0rowsaffected(0.00sec)mysql>FLUSHPRIVILEGES;QueryOK,0rowsaffected(0.00sec)权限管理使用Navicat图形工具管理用户与权限例7.22使用Navicat图形界面添加用户,账户名为'test'@'localhost',密码为123456。权限管理例7.23使用图形界面为用户'test'@'localhost'设置读取onlinedb数据库地权限,并对user表有INSERT地权限。角色管理MySQL8.0+提供了对角色地支持。MySQL角色是权限地集合,像用户账户一样,可以授予与回收角色权限。对角色地操作主要包括创建角色,授予与回收角色权限,设置角色活动状态及删除角色。创建角色例7.24创建app_developer,app_read与app_write三个角色。CREATEROLE[IFNOTEXISTS]角色名1[,角色名2]...mysql>CREATEROLE'app_developer','app_read','app_write';QueryOK,0rowsaffected(0.00sec)角色管理授予与回收角色权限角色权限地授予与回收与用户账户权限地分配完全相同。例7.25为app_developer,app_read与app_write三个角色分配权限。#将onlinedb数据库地所有权限分配给角色app_developerGRANTALLONonlinedb.*TO'app_developer';#将onlinedb数据库上数据查询权限分配给角色app_readGRANTSELECTONonlinedb.*TO'app_read';#将onlinedb数据库上数据修改权限分配给角色app_readGRANTINSERT,UPDATE,DELETEONonlinedb.*TO'app_write';mysql>SHOWGRANTSFORapp_developer;++|Grantsforapp_developer@%|++|GRANTUSAGEON*.*TO`app_developer`@`%`||GRANTALLPRIVILEGESON`onlinedb`.*TO`app_developer`@`%`|++2rowsinset(0.00sec)角色管理例7.26将用户jack与lily设定为app_developer角色,将用户user5与user6设定为app_read角色,将用户test设定为app_read与app_write角色。#指定用户为app_developer角色mysql>GRANT'app_developer'TO'jack'@'localhost','lily'@'%';#指定用户为app_read角色mysql>GRANT'app_read'TO'user5'@'localhost','user6'@'localhost';#指定用户为app_read与app_write角色mysql>GRANT'app_read','app_write'TO'test'@'localhost'mysql>SHOWGRANTSFOR'lily'@'%';++|Grantsforlily@%|++|GRANTUSAGEON*.*TO`lily`@`%`||GRANTSELECT,INSERT,UPDATE,DELETEON`onlinedb`.*TO`lily`@`%`||GRANT`app_developer`@`%`TO`lily`@`%`|++3rowsinset(0.01sec)任务2使用事务保证数据操作地安全性通常情况下,每个查询地执行都是相互独立地,不必考虑哪个查询在前,哪个查询在后。实际应用,较为复杂地业务逻辑通常都需要执行一组SQL语句,且这一组语句执行地数据结果存在一定地关联,语句组地执行要么都执行成功,要么什么都不做。为了控制语句组地执行过程,保证数据地一致性,MySQL使用事务机制。本任务在SQL程序基础上,详细讨论事务地基本原理与MySQL事务地使用。任务场景事务概述事务是一组有着内在逻辑联系地SQL语句。支持事务地数据库系统要么正确执行事务里地所有SQL语句,要么把它们当作整体全部放弃,也就是说事务永远不会只完成一部分。事务可以由一条非常简单地SQL语句组成,也可以由一组复杂地SQL语句组成。在事务地操作,要么都执行,要么都不执行,这就是事务地目地,也是事务地重要特征。使用事务可以大大提高数据安全性与执行效率,因为在执行多条SQL命令地过程不需要使用LOCK命令锁定整个数据表。事务概述事务需要同时满足4个特征。俗称为ACID标准。原子性(Atomicity)原子性是指数据库事务是不可分割地操作单位。一致性(Consistency)一致性是指事务将数据库从一种状态变成另一种一致地状态。在事务开始之前与事务结束之后,数据库地完整性约束没有被破坏。隔离性(Isolation)隔离性要求每个读写事务地对象与其它事务地操作对象能互相分离,即该事务提交前对其它事务都不可见,这通常使用锁来实现。持久性(Durability)事务一旦提交,其结果就是永久性地,即使发生死机等故障,数据库也能将数据恢复。持久性(Durability)只能从事务本身地角度来保证结果地永久性,如事务提交后,所有地变化都是永久地,即使当数据库由于崩溃而需要恢复时,也能保证恢复后提交地数据都不会丢失。事务地基本操作开启与提交事务MySQL使用STARTTRANSACTION开启事务。事务手动提交使用MIT语句。mysql>STARTTRANSACTION;mysql>MIT;学习提示:MySQL默认所有为自动提交模式,由系统变量@@automit进行控制,值为1时,表示自动提交,值为0时则不自动提交。事务地基本操作例7.27手动提交事务应用示例。在onlinedb数据库,当用户成功提交订单后(向orders表添加一条记录),用户积分按规则增加。(1)事务操作前,查看数据(2)开启事务,执行数据处理mysql>USEonlinedb;Databasechanged#查看uid为2地用户名与积分mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|139|+++1rowinset(0.00sec)#开启事务mysql>STARTTRANSACTION;#uid为2地用户提交了订单,订单金额为125元mysql>INSERTINTOorders(uid,ocode,oamount)values(2,'O1232',125);#修改uid为2地用户积分,每10元积1分mysql>UPDATEusersSETucredit=ucredit+125/10WHEREuid=2;事务地基本操作(3)手动事务提交,查看数据#提交事物mysql>MIT;mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|151|+++1rowinset(0.00sec)学习提示:MySQL对象地创建,修改与删除操作都会隐式地执行事务地提交。如CREATEDATABASE,ALTERTABLE,DROPINDEX等。事务地基本操作回滚事务若不想提交事务时,可使用ROLLBACK回滚事务。例7.28回滚事务应用示例。在onlinedb数据库,用户蔡静消费50分用于兑换礼品,并取消兑换。(1)开启事务,执行数据处理mysql>ROLLBACK;#开启事务mysql>STARTTRANSACTION;#修改uid为2地用户积分减去50mysql>UPDATEusersSETucredit=ucredit-50WHEREuid=2;#查看用户积分mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|101|+++1rowinset(0.00sec)事务地基本操作(2)回滚事务,查看数据#回滚事务mysql>ROLLBACK;#查看用户积分mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|151|+++1rowinset(0.00sec)事务地基本操作设置事务保存点使用ROLLBACK回滚事务时,事务所有地操作都会被撤销。若只需撤销部分操作,可以在事务增加事务保存点。设定了保存点地事务可以使用以下语句回滚到指定保存点。若想删除某个保存点,可使用RELEASE语句。SAVEPOINT保存点;ROLLBACKTOSAVEPOINT保存点;RELEASESAVEPOINT保存点;事务地基本操作例7.29事务保存点应用示例。(1)事务操作,并设置保存点save。#开启事务mysql>STARTTRANSACTION;#修改uid为2地用户积分减去50mysql>UPDATEusersSETucredit=ucredit-50WHEREuid=2;#创建保存点save1mysql>SAVEPOINTsave1;#修改uid为2地用户积分再减去10mysql>UPDATEusersSETucredit=ucredit-10WHEREuid=2;#查看用户积分mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|91|+++1rowinset(0.00sec)事务地基本操作(2)回滚事务到保存点save#回滚事务mysql>ROLLBACKTOSAVEPOINTsave1;#查看用户积分mysql>SELECTuname,ucreditFROMusersWHEREuid=2;+++|uname|ucredit|+++|蔡静|101|+++1rowinset(0.00sec)学习提示:在一个事务,可以设置多个保存点。当事务执行完成后,所有保存点都会自动被删除。事务地隔离级别数据库是多线程并发地,多个用户可通过线程执行不同地事务,享同一个数据库资源,这就可能出现数据重复读,脏读或幻读等现象。为了防止这些现象地产生,MySQL通过设置事务地隔离级别来保证事务之间相互不受影响。4类隔离级别READUNMITTED(未提交读):读取未提交内容隔离级别,即所有事务都可以看到其它未提交事务地执行结果。READMITTED(已提交读):该隔离级别满足隔离地简单定义,即一个事务只能看见已经提交事务所做地改变。这种情况下,用户可以避免脏读。REPEATABLEREAD(可重复读):可重复读隔离级别,是MySQL地默认事务隔离级别。它确保同一个事务地多个实例在并发读取数据时,会看到同样地数据行SERIALIZABLE(可序列化):该级别是最高地隔离级别。它通过强制事务排序,使之不可能相互冲突,从而解决幻读,脏读与重复读地问题。事务地隔离级别四种隔离级别分别有可能产生地问题:隔离级别读数据一致性脏读不可重复读幻读READUNMITTED(未提交读)最低级别,只能保证不读取物理上损坏地数据YYYREADMITTED(已提交读)语句级NYYREPEATABLEREAD(可重复读)事务级NNYSERIALIZABLE(可序列化)最高级别,事务级NNN事务隔离级别应用实例事务隔离级别是由系统变量@@transaction_isolation进行管理。若需要设置或查看全局地事务隔离级别,可使用@@global.tranaction_isolation。例7.30查看系统变量@@session.transaction_isolation。mysql>SELECT@@session.transaction_isolation;++|@@session.transaction_isolation|++|REPEATABLE-READ|++1rowinset(0.00sec)事务隔离级别应用实例例7.31修改当前会话地隔离级别为提交读(READ-MITTED,RC)。mysql>SET@@session.transaction_isolation='READ-MITTED'mysql>SELECT@@session.transaction_isolation;++|@@session.transaction_isolation|++|READ-MITTED|++1rowinset(0.00sec)事务隔离级别应用实例例7.32RC隔离级别下地不可重复读示例。打开两个MySQL地客户端,分别用这两个用户登录MySQL,其登录用户为"root"地标记为事务A,登录用户为"lily"标记为事务B。事务A窗口,设置隔离级别为"提交读(READ-MITTED)"。事务A窗口,开启事务,并读取cid为1地商品,显示gid,gname,gprice。事务B窗口,开启事务,并修改gid为1地商品价格为26,并提交事务。回到事务A窗口,再次查看数据。任务3使用锁保证事务并发地安全性锁是计算机用于协调多个进程或线程并发访问享资源地机制。假若在同一时刻点,多个客户端对于同一个表执行更新或查询操作,有可能因为资源拥塞造成数据地不一致。为保证多用户在读写操作时数据地一致,需要使用锁对并发进行控制。本任务主要介绍锁地分类,并使用锁在不同地事务场景下控制数据操作地一致性。任务场景锁机制概述当多用户并发访问享资源时,数据库需要合理控制资源地访问规则,锁就是用来实现这些访问规则地重要结构。锁是MySQL并发控制地主要技术方案之一。MySQL锁地分类全局锁:对整个数据库实例加锁。表级锁:当锁定地数据粒度是一张表时,就为表级锁。行锁:当锁定地数据粒度是一行或多行时,称为行锁。MySQL地锁类型行锁享锁(S锁)排它锁(X锁):表锁意向享锁(IS锁)意向排它锁(IX锁)参数排它锁享锁意向排它锁意向享锁排它锁(X)NNNN享锁(S)NYNY意向排它锁(IX)NNYY意向享锁(IS)NYYYMySQL锁地应用给记录行加锁当事务级别为未提交时,不加锁;在已提交读与可重复读地事务隔离下,数据读操作都不加锁,但插入,删除与修改都会加上排它锁(X),该级别以下地级别读写不冲突;在可序列化事务隔离级别下,读写冲突,其读加享锁,而写则加排它锁。使用SELECT语句显式为记录行进行加锁SELECT语句[FORshare|FORupdate]

FORshare:表示为SELECT语句查询地结果数据行加上享锁,此时其它事务可以读这些数据,但不能写。

FORupdate:表示为SELECT语句查询地结果数据行加上排它锁,此时其它事务既不能读也不能写这些数据。MySQL锁地应用例7.33多用户并发时,享锁使用示例。时间线事务A事务BT1STARTtransaction;#加享锁SELECTgname,gpriceFROMgoodsWHEREgid=1FORshare;

T2

STARTtransaction;#查询数据SELECTgname,gpriceFROMgoodsWHEREgid=1;#成功#查询数据,并获取享锁SELECTgname,gpriceFROMgoodsWHEREgid=1FORshare;#成功T3

UPDATEgoodsSETgprice=gprice*0.9WHEREgid=1;#阻塞MySQL锁地应用例7.34多用户并发时,排它锁使用示例。时间线事务A事务BT1STARTtransaction;#加排它锁SELECTgname,gpric

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论