Mysql行级锁/页级锁/表级锁详解

页级:引擎 BDB
表级:引擎 MyISAM,理解为锁住整个表,可以同时读,但不可同时写
行级:引擎 INNODB,单独的一行记录加锁

表级:直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许。
行级:仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
页级:表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

Read More

MySQL事务处理

《PHP与MYSQL权威指南》第245页,事务处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*************** transaction--1 ***************/  
$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
mysql_select_db('test',$conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;
//开始一个事务
mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION");
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END");
/**************** transaction--2 *******************/
/*方法二*/
mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交
$sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')";
$sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错
$res = mysql_query($sql);
$res1 = mysql_query($sql2);
if($res && $res1){
mysql_query("COMMIT");
echo '提交成功。';
}else{
mysql_query("ROLLBACK");
echo '数据回滚。';
}
mysql_query("END"); //事务处理完时别忘记mysql_query("SET AUTOCOMMIT=1");自动提交

ecshop属性{$goods.goods_attr|nl2br}标签的赋值相关

1、nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />)。

2、如果要向{$goods.goods_attr|nl2br}赋新值,这个值是保存在数据库中的,用户在商品页(goods.php)选择了商品属性(goods.attr)之后,点击”购买”就会进入购物车页面(flow.php),同时,将用户选择的商品属性(goods.attr)保存进了数据库,当进入购物车页面的时候,楼主可以看flow.dwt的代码(<!-- {foreach from=$goods_list item=goods} -->),那么{$goods.goods_attr}这个东西的值来自于flow.php中的$goods_list,查看flow.php,会发现,$goods_list的值来自cart_goods()这个方法,cart_goods()这个方法在includes/lib_order.php内,那里面有一段sql

1
2
3
4
5
6
($sql = "SELECT 。。。, " .
"。。。, goods_attr(重点),。。。, " .
"。。。 " .
"FROM " . $GLOBALS['ecs']->table('cart') .
" WHERE session_id = '" . SESS_ID . "' " .
"AND rec_type = '$type'";)

这个sql里面的goods_attr就是楼主你想要的值,它来自数据表cart,而用户对于商品属性的选择决定了cart这个表的goods_attr保存什么样的值。

Read More